Skip to content

Commit cba5eaf

Browse files
committed
wip2
1 parent e297853 commit cba5eaf

2 files changed

Lines changed: 125 additions & 119 deletions

File tree

src/darkleaf/di/core.clj

Lines changed: 111 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@
4444
(defn- seq-contains? [xs x]
4545
(not (neg? (index-of xs x))))
4646

47-
(defn- try-namespace [x]
48-
(when (ident? x)
49-
(namespace x)))
47+
(defn ^:dynamic *next-id*
48+
""
49+
[]
50+
(throw (IllegalStateException. "Unbound")))
5051

5152
(def ^:private dependency-type-priority
5253
{:required 1
@@ -125,8 +126,9 @@
125126
built-map))
126127

127128
:else
128-
(let [obj (build-obj built-map factory)]
129-
(vswap! *stop-list conj #(p/demolish factory obj))
129+
(let [obj (build-obj built-map factory)
130+
stop (bound-fn* #(p/demolish factory obj))]
131+
(vswap! *stop-list conj stop)
130132
(case [obj dep-type]
131133
[nil :optional] (recur tail built-map)
132134
[nil :required] (missing-dependency! stack)
@@ -202,16 +204,6 @@
202204
(System/getenv key))
203205
(registry key))))
204206

205-
(defn- with-per-system-objects
206-
""
207-
[registry]
208-
(let [id (AtomicInteger.)
209-
next-id (fn next-id [] (.incrementAndGet id))]
210-
(fn [key]
211-
(case key
212-
::next-id next-id
213-
(registry key)))))
214-
215207
(declare ref template)
216208

217209
(defn- key->key&registry [key]
@@ -220,6 +212,11 @@
220212
(map? key) [::implicit-root {::implicit-root (-> key (update-vals ref) template)}]
221213
true [key nil]))
222214

215+
(defn- ->next-id []
216+
(let [id (AtomicInteger.)]
217+
(fn next-id []
218+
(.incrementAndGet id))))
219+
223220
(defn ^AutoCloseable start
224221
"Starts a system of dependent objects.
225222
@@ -270,90 +267,90 @@
270267
See the tests for use cases.
271268
See `update-key`."
272269
[key & middlewares]
273-
(let [[key root-registry] (key->key&registry key)
274-
275-
middlewares (concat [with-per-system-objects
276-
with-env
277-
with-ns
278-
root-registry]
279-
middlewares)
280-
registry (apply-middleware nil-registry middlewares)
281-
ctx {:registry registry
282-
:*stop-list (volatile! '())}
283-
obj (try-build ctx key)]
284-
^{:type ::root
285-
::print obj}
286-
(reify
287-
AutoCloseable
288-
(close [_]
289-
(->> (try-stop-started ctx)
290-
(throw-many!)))
291-
IDeref
292-
(deref [_]
293-
obj)
294-
Indexed
295-
(nth [_ i]
296-
(nth obj i))
297-
(nth [_ i not-found]
298-
(nth obj i not-found))
299-
(count [_]
300-
(count obj))
301-
ILookup
302-
(valAt [_ key]
303-
(get obj key))
304-
(valAt [_ key not-found]
305-
(get obj key not-found))
306-
IFn
307-
(call [_]
308-
(.call ^IFn obj))
309-
(run [_]
310-
(.run ^IFn obj))
311-
(invoke [this]
312-
(.invoke ^IFn obj))
313-
(invoke [_ a1]
314-
(.invoke ^IFn obj a1))
315-
(invoke [_ a1 a2]
316-
(.invoke ^IFn obj a1 a2))
317-
(invoke [_ a1 a2 a3]
318-
(.invoke ^IFn obj a1 a2 a3))
319-
(invoke [_ a1 a2 a3 a4]
320-
(.invoke ^IFn obj a1 a2 a3 a4))
321-
(invoke [_ a1 a2 a3 a4 a5]
322-
(.invoke ^IFn obj a1 a2 a3 a4 a5))
323-
(invoke [_ a1 a2 a3 a4 a5 a6]
324-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6))
325-
(invoke [_ a1 a2 a3 a4 a5 a6 a7]
326-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7))
327-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8]
328-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8))
329-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9]
330-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9))
331-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10]
332-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10))
333-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11]
334-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11))
335-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12]
336-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12))
337-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13]
338-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13))
339-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14]
340-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14))
341-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15]
342-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15))
343-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16]
344-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16))
345-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17]
346-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17))
347-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18]
348-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18))
349-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19]
350-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19))
351-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20]
352-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20))
353-
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 args]
354-
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 args))
355-
(applyTo [_ args]
356-
(.applyTo ^IFn obj args)))))
270+
(binding [*next-id* (->next-id)]
271+
(let [[key root-registry] (key->key&registry key)
272+
273+
middlewares (concat [with-env
274+
with-ns
275+
root-registry]
276+
middlewares)
277+
registry (apply-middleware nil-registry middlewares)
278+
ctx {:registry registry
279+
:*stop-list (volatile! '())}
280+
obj (try-build ctx key)]
281+
^{:type ::root
282+
::print obj}
283+
(reify
284+
AutoCloseable
285+
(close [_]
286+
(->> (try-stop-started ctx)
287+
(throw-many!)))
288+
IDeref
289+
(deref [_]
290+
obj)
291+
Indexed
292+
(nth [_ i]
293+
(nth obj i))
294+
(nth [_ i not-found]
295+
(nth obj i not-found))
296+
(count [_]
297+
(count obj))
298+
ILookup
299+
(valAt [_ key]
300+
(get obj key))
301+
(valAt [_ key not-found]
302+
(get obj key not-found))
303+
IFn
304+
(call [_]
305+
(.call ^IFn obj))
306+
(run [_]
307+
(.run ^IFn obj))
308+
(invoke [this]
309+
(.invoke ^IFn obj))
310+
(invoke [_ a1]
311+
(.invoke ^IFn obj a1))
312+
(invoke [_ a1 a2]
313+
(.invoke ^IFn obj a1 a2))
314+
(invoke [_ a1 a2 a3]
315+
(.invoke ^IFn obj a1 a2 a3))
316+
(invoke [_ a1 a2 a3 a4]
317+
(.invoke ^IFn obj a1 a2 a3 a4))
318+
(invoke [_ a1 a2 a3 a4 a5]
319+
(.invoke ^IFn obj a1 a2 a3 a4 a5))
320+
(invoke [_ a1 a2 a3 a4 a5 a6]
321+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6))
322+
(invoke [_ a1 a2 a3 a4 a5 a6 a7]
323+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7))
324+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8]
325+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8))
326+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9]
327+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9))
328+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10]
329+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10))
330+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11]
331+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11))
332+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12]
333+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12))
334+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13]
335+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13))
336+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14]
337+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14))
338+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15]
339+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15))
340+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16]
341+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16))
342+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17]
343+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17))
344+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18]
345+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18))
346+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19]
347+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19))
348+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20]
349+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20))
350+
(invoke [_ a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 args]
351+
(.invoke ^IFn obj a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 args))
352+
(applyTo [_ args]
353+
(.applyTo ^IFn obj args))))))
357354

358355
(defn stop
359356
"Stops the root of a system"
@@ -513,8 +510,7 @@
513510
[target f & args]
514511
{:pre [(key? target)]}
515512
(fn [registry]
516-
(let [next-id (registry ::next-id)
517-
prefix (str (symbol target) "+di-update-key#" (next-id))
513+
(let [prefix (str (symbol target) "+di-update-key#" (*next-id*))
518514
new-key (symbol (str prefix "-target"))
519515
f-key (symbol (str prefix "-f"))
520516
arg-keys (for [i (-> args count range)]
@@ -557,10 +553,9 @@
557553
```"
558554
[dep-key]
559555
(fn [registry]
560-
(let [next-id (registry ::next-id)
561-
*orig-key (volatile! nil)
556+
(let [*orig-key (volatile! nil)
562557
*orig-factory (volatile! nil)
563-
new-key (symbol (str "darkleaf.di.generated/new-key#" (next-id)))
558+
new-key (symbol (str "darkleaf.di.generated/new-key#" (*next-id*)))
564559
new-factory (reify p/Factory
565560
(dependencies [_]
566561
;; array-map preserves order of keys
@@ -570,21 +565,14 @@
570565
(new-key deps))
571566
(demolish [_ _]))]
572567
(fn [key]
573-
;;
574-
;; ну такое
575-
;; в update-key тоже самое же нужно делать?
576-
;;
577-
(if (= "darkleaf.di.core" (try-namespace key))
578-
(registry key)
579-
(do
580-
(when (nil? @*orig-key)
581-
(vreset! *orig-key key))
582-
(when (nil? @*orig-factory)
583-
(vreset! *orig-factory (registry key)))
584-
(cond
585-
(= @*orig-key key) new-factory
586-
(= new-key key) @*orig-factory
587-
:else (registry key))))))))
568+
(when (nil? @*orig-key)
569+
(vreset! *orig-key key))
570+
(when (nil? @*orig-factory)
571+
(vreset! *orig-factory (registry key)))
572+
(cond
573+
(= @*orig-key key) new-factory
574+
(= new-key key) @*orig-factory
575+
:else (registry key))))))
588576

589577
(defn- arglists [variable]
590578
(-> variable meta :arglists))
@@ -695,6 +683,10 @@
695683
(binding [*out* w]
696684
(pr (-> o meta ::print))))
697685

686+
(defn- try-namespace [x]
687+
(when (ident? x)
688+
(namespace x)))
689+
698690
(defn env-parsing
699691
"A registry middleware for parsing environment variables.
700692
You can define a dependency of env as a string key like \"PORT\",

test/darkleaf/di/next_id_test.clj

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
(ns darkleaf.di.next-id-test
2+
(:require
3+
[clojure.test :as t]
4+
[darkleaf.di.core :as di]))
5+
6+
(defn a
7+
{::di/stop #(swap! % assoc :stop-id (di/*next-id*))}
8+
[]
9+
(atom {:start-id (di/*next-id*)}))
10+
11+
(t/deftest a-test
12+
(let [root (di/start `a)]
13+
(di/stop root)
14+
(t/is (= {:start-id 1 :stop-id 2} @@root))))

0 commit comments

Comments
 (0)