|
44 | 44 | (defn- seq-contains? [xs x] |
45 | 45 | (not (neg? (index-of xs x)))) |
46 | 46 |
|
47 | | -(defn- try-namespace [x] |
48 | | - (when (ident? x) |
49 | | - (namespace x))) |
| 47 | +(defn ^:dynamic *next-id* |
| 48 | + "" |
| 49 | + [] |
| 50 | + (throw (IllegalStateException. "Unbound"))) |
50 | 51 |
|
51 | 52 | (def ^:private dependency-type-priority |
52 | 53 | {:required 1 |
|
125 | 126 | built-map)) |
126 | 127 |
|
127 | 128 | :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) |
130 | 132 | (case [obj dep-type] |
131 | 133 | [nil :optional] (recur tail built-map) |
132 | 134 | [nil :required] (missing-dependency! stack) |
|
202 | 204 | (System/getenv key)) |
203 | 205 | (registry key)))) |
204 | 206 |
|
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 | | - |
215 | 207 | (declare ref template) |
216 | 208 |
|
217 | 209 | (defn- key->key®istry [key] |
|
220 | 212 | (map? key) [::implicit-root {::implicit-root (-> key (update-vals ref) template)}] |
221 | 213 | true [key nil])) |
222 | 214 |
|
| 215 | +(defn- ->next-id [] |
| 216 | + (let [id (AtomicInteger.)] |
| 217 | + (fn next-id [] |
| 218 | + (.incrementAndGet id)))) |
| 219 | + |
223 | 220 | (defn ^AutoCloseable start |
224 | 221 | "Starts a system of dependent objects. |
225 | 222 |
|
|
270 | 267 | See the tests for use cases. |
271 | 268 | See `update-key`." |
272 | 269 | [key & middlewares] |
273 | | - (let [[key root-registry] (key->key®istry 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®istry 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)))))) |
357 | 354 |
|
358 | 355 | (defn stop |
359 | 356 | "Stops the root of a system" |
|
513 | 510 | [target f & args] |
514 | 511 | {:pre [(key? target)]} |
515 | 512 | (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*)) |
518 | 514 | new-key (symbol (str prefix "-target")) |
519 | 515 | f-key (symbol (str prefix "-f")) |
520 | 516 | arg-keys (for [i (-> args count range)] |
|
557 | 553 | ```" |
558 | 554 | [dep-key] |
559 | 555 | (fn [registry] |
560 | | - (let [next-id (registry ::next-id) |
561 | | - *orig-key (volatile! nil) |
| 556 | + (let [*orig-key (volatile! nil) |
562 | 557 | *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*))) |
564 | 559 | new-factory (reify p/Factory |
565 | 560 | (dependencies [_] |
566 | 561 | ;; array-map preserves order of keys |
|
570 | 565 | (new-key deps)) |
571 | 566 | (demolish [_ _]))] |
572 | 567 | (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)))))) |
588 | 576 |
|
589 | 577 | (defn- arglists [variable] |
590 | 578 | (-> variable meta :arglists)) |
|
695 | 683 | (binding [*out* w] |
696 | 684 | (pr (-> o meta ::print)))) |
697 | 685 |
|
| 686 | +(defn- try-namespace [x] |
| 687 | + (when (ident? x) |
| 688 | + (namespace x))) |
| 689 | + |
698 | 690 | (defn env-parsing |
699 | 691 | "A registry middleware for parsing environment variables. |
700 | 692 | You can define a dependency of env as a string key like \"PORT\", |
|
0 commit comments