File tree 2 files changed +35
-12
lines changed
src/main/cljs/cljs/spec/impl
2 files changed +35
-12
lines changed Original file line number Diff line number Diff line change 8
8
9
9
(ns cljs.spec.impl.gen
10
10
(:refer-clojure :exclude [delay])
11
- (:require [cljs.core :as c]))
11
+ (:require [cljs.core :as c]
12
+ [clojure.string :as string]))
12
13
13
14
(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 )))
18
31
19
32
(defmacro delay
20
33
" given body that returns a generator, returns a
28
41
[s]
29
42
(let [fqn (symbol " clojure.test.check.generators" (name s))
30
43
doc (str " Lazy loaded version of " fqn)]
31
- `(let [g# (c/delay ( dynaload '~fqn) )]
44
+ `(let [g# (dynaload '~fqn)]
32
45
(defn ~s
33
46
~doc
34
47
[& ~'args]
47
60
[s]
48
61
(let [fqn (symbol " clojure.test.check.generators" (name s))
49
62
doc (str " Fn returning " fqn)]
50
- `(let [g# (c/delay ( dynaload '~fqn) )]
63
+ `(let [g# (dynaload '~fqn)]
51
64
(defn ~s
52
65
~doc
53
66
[& ~'args]
Original file line number Diff line number Diff line change 13
13
[cljs.spec.impl.gen :as gen :refer [dynaload lazy-combinators lazy-prims]])
14
14
(:require [cljs.core :as c]))
15
15
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
+
16
26
(def ^:private quick-check-ref
17
- (c/delay ( dynaload 'clojure.test.check/quick-check) ))
27
+ (dynaload 'clojure.test.check/quick-check))
18
28
19
29
(defn quick-check
20
30
[& args]
21
31
(apply @quick-check-ref args))
22
32
23
33
(def ^:private for-all*-ref
24
- (c/delay ( dynaload 'clojure.test.check.properties/for-all*) ))
34
+ (dynaload 'clojure.test.check.properties/for-all*))
25
35
26
36
(defn for-all*
27
37
" Dynamically loaded clojure.test.check.properties/for-all*."
28
38
[& args]
29
39
(apply @for-all*-ref args))
30
40
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)]
34
44
(defn- generator?
35
45
[x]
36
46
(@g? x))
You can’t perform that action at this time.
0 commit comments