Skip to content

Commit f75687f

Browse files
committed
make dynaload more ClojureScript friendly
1 parent c0b1142 commit f75687f

File tree

2 files changed

+35
-12
lines changed

2 files changed

+35
-12
lines changed

src/main/cljs/cljs/spec/impl/gen.cljc

+20-7
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,26 @@
88

99
(ns cljs.spec.impl.gen
1010
(:refer-clojure :exclude [delay])
11-
(:require [cljs.core :as c]))
11+
(:require [cljs.core :as c]
12+
[clojure.string :as string]))
1213

1314
(defmacro dynaload [[quote s]]
14-
`(if (c/exists? ~s)
15-
~(vary-meta s assoc :cljs.analyzer/no-resolve true)
16-
(fn [& ~'args]
17-
(throw (js/Error. (str "Var " '~s " is not on the classpath"))))))
15+
(let [xs (string/split (namespace s) #"\.")
16+
cnt (count xs)
17+
checks (map
18+
(fn [n xs]
19+
`(c/exists? ~(symbol (string/join "." (take n xs)))))
20+
(range 2 cnt)
21+
(repeat xs))]
22+
`(cljs.spec.impl.gen/LazyVar.
23+
(fn []
24+
(if (and ~@checks (c/exists? ~s))
25+
~(vary-meta s assoc :cljs.analyzer/no-resolve true)
26+
(throw
27+
(js/Error.
28+
(str "Var " '~s " does not exist, "
29+
(namespace '~s) " never required")))))
30+
nil)))
1831

1932
(defmacro delay
2033
"given body that returns a generator, returns a
@@ -28,7 +41,7 @@
2841
[s]
2942
(let [fqn (symbol "clojure.test.check.generators" (name s))
3043
doc (str "Lazy loaded version of " fqn)]
31-
`(let [g# (c/delay (dynaload '~fqn))]
44+
`(let [g# (dynaload '~fqn)]
3245
(defn ~s
3346
~doc
3447
[& ~'args]
@@ -47,7 +60,7 @@
4760
[s]
4861
(let [fqn (symbol "clojure.test.check.generators" (name s))
4962
doc (str "Fn returning " fqn)]
50-
`(let [g# (c/delay (dynaload '~fqn))]
63+
`(let [g# (dynaload '~fqn)]
5164
(defn ~s
5265
~doc
5366
[& ~'args]

src/main/cljs/cljs/spec/impl/gen.cljs

+15-5
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,34 @@
1313
[cljs.spec.impl.gen :as gen :refer [dynaload lazy-combinators lazy-prims]])
1414
(:require [cljs.core :as c]))
1515

16+
(deftype LazyVar [f ^:mutable cached]
17+
IDeref
18+
(-deref [this]
19+
(if-not (nil? cached)
20+
cached
21+
(let [x (f)]
22+
(when-not (nil? x)
23+
(set! cached x))
24+
x))))
25+
1626
(def ^:private quick-check-ref
17-
(c/delay (dynaload 'clojure.test.check/quick-check)))
27+
(dynaload 'clojure.test.check/quick-check))
1828

1929
(defn quick-check
2030
[& args]
2131
(apply @quick-check-ref args))
2232

2333
(def ^:private for-all*-ref
24-
(c/delay (dynaload 'clojure.test.check.properties/for-all*)))
34+
(dynaload 'clojure.test.check.properties/for-all*))
2535

2636
(defn for-all*
2737
"Dynamically loaded clojure.test.check.properties/for-all*."
2838
[& args]
2939
(apply @for-all*-ref args))
3040

31-
(let [g? (c/delay (dynaload 'clojure.test.check.generators/generator?))
32-
g (c/delay (dynaload 'clojure.test.check.generators/generate))
33-
mkg (c/delay (dynaload 'clojure.test.check.generators/->Generator))]
41+
(let [g? (dynaload 'clojure.test.check.generators/generator?)
42+
g (dynaload 'clojure.test.check.generators/generate)
43+
mkg (dynaload 'clojure.test.check.generators/->Generator)]
3444
(defn- generator?
3545
[x]
3646
(@g? x))

0 commit comments

Comments
 (0)