Skip to content

Commit 18ba401

Browse files
committed
Merge upstream PR clojureman#9
1 parent 916b415 commit 18ba401

File tree

2 files changed

+122
-0
lines changed

2 files changed

+122
-0
lines changed

src/special/eagerize.cljc

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
(ns special.eagerize)
2+
3+
#?(:clj
4+
(defonce array-object-type (delay (Class/forName "[Ljava.lang.Object;"))))
5+
6+
(defprotocol Eagerizable
7+
"Container types that want to work safely with special should implement this
8+
protocol in a way where all elements they contain, even deeply nested, will
9+
be realized and made eager."
10+
(eagerize [this]))
11+
12+
#?(:clj
13+
(extend-protocol Eagerizable
14+
nil
15+
(eagerize [this] this)
16+
java.lang.Object
17+
(eagerize [this] (if (instance? @array-object-type this)
18+
(doall (map eagerize this))
19+
this))
20+
clojure.lang.IPersistentList
21+
(eagerize [this] (apply list (map eagerize this)))
22+
clojure.lang.IMapEntry
23+
(eagerize [this] (vec (map eagerize this)))
24+
clojure.lang.ISeq
25+
(eagerize [this] (doall (map eagerize this)))
26+
clojure.lang.IRecord
27+
(eagerize [this] (reduce (fn [r x] (conj r (eagerize x))) this this))
28+
clojure.lang.IPersistentCollection
29+
(eagerize [this] (into (empty this) (map eagerize this)))
30+
clojure.lang.IType
31+
(eagerize [this] (doall
32+
(map #(eagerize (.get % this))
33+
(.getFields (class this)))))
34+
clojure.lang.Delay
35+
(eagerize [this] (eagerize (deref this)))
36+
java.lang.Iterable
37+
(eagerize [this] (doall (map eagerize this)))
38+
java.util.Map
39+
(eagerize [this] (doall (map eagerize (.values this))))))
40+
41+
#?(:cljs (extend-protocol Eagerizable
42+
default
43+
(eagerize [this] (pr-str this))))

test/special/eagerize_test.clj

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
(ns special.eagerize-test
2+
(:require [clojure.test :refer [deftest is testing]]
3+
[special.eagerize :refer [eagerize]]))
4+
5+
(defn- make-nested-lazy-list
6+
"Returns a lazy-sequece of e.
7+
Defaults to random-ints when called with no args."
8+
([]
9+
(make-nested-lazy-list #(rand-int 42)))
10+
([e]
11+
(repeatedly 10 (constantly e))))
12+
13+
(defrecord TestRecord [s])
14+
(deftype TestType [s])
15+
16+
(deftest eagerize-test
17+
(testing "Can eagerize deep nested Clojure IPersistentList."
18+
(is (realized?
19+
(let [ls (list (make-nested-lazy-list))]
20+
(eagerize ls)
21+
(first ls)))))
22+
23+
(testing "Can eagerize deep nested Clojure IMapEntry."
24+
(is (realized?
25+
(let [ls (first {:e (make-nested-lazy-list)})]
26+
(eagerize ls)
27+
(val ls)))))
28+
29+
(testing "Can eagerize deep nested Clojure ISeq."
30+
(is (realized?
31+
(let [ls (make-nested-lazy-list (make-nested-lazy-list))]
32+
(eagerize ls)
33+
(first ls)))))
34+
35+
(testing "Can eagerize deep nested Clojure IRecord."
36+
(is (realized?
37+
(let [ls (->TestRecord (make-nested-lazy-list))]
38+
(eagerize ls)
39+
(:s ls)))))
40+
41+
(testing "Can eagerize deep nested Clojure IType."
42+
(is (realized?
43+
(let [ls (TestType. (make-nested-lazy-list))]
44+
(eagerize ls)
45+
(.-s ls)))))
46+
47+
(testing "Can eagerize deep nested Clojure Delay."
48+
(is (realized?
49+
(let [ls (delay (make-nested-lazy-list))]
50+
(eagerize ls)
51+
@ls))))
52+
53+
(testing "Can eagerize deep nested Java Iterable."
54+
(is (realized?
55+
(let [ls (doto (java.util.LinkedList.)
56+
(.add (make-nested-lazy-list)))]
57+
(eagerize ls)
58+
(first ls)))))
59+
60+
(testing "Can eagerize deep nested Java AbstractMap."
61+
(is (realized?
62+
(let [ls (doto (java.util.HashMap.)
63+
(.put "a" (make-nested-lazy-list)))]
64+
(eagerize ls)
65+
(.get ls "a")))))
66+
67+
(testing "Can eagerize deep nested Java Stack."
68+
(is (realized?
69+
(let [ls (doto (java.util.Stack.)
70+
(.push (make-nested-lazy-list)))]
71+
(eagerize ls)
72+
(.pop ls)))))
73+
74+
(testing "Can eagerize deep nested Java Arrays."
75+
(is (realized?
76+
(let [ls (doto (make-array clojure.lang.ISeq 2)
77+
(aset 0 (make-nested-lazy-list)))]
78+
(eagerize ls)
79+
(aget ls 0))))))

0 commit comments

Comments
 (0)