Test for defining protocol on potentially infinite data structures
This commit is contained in:
parent
d4f9e89577
commit
db4c1d049d
1 changed files with 39 additions and 0 deletions
39
test/babashka/protocols_test.clj
Normal file
39
test/babashka/protocols_test.clj
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
(ns babashka.protocols-test
|
||||
(:require [babashka.test-utils :refer [bb]]
|
||||
[clojure.test :as t :refer [deftest is]]))
|
||||
|
||||
(deftest safe-datafy
|
||||
(is (bb
|
||||
"
|
||||
(ns safe-datafy
|
||||
(:require [clojure.core.protocols :as p]
|
||||
[clojure.datafy :as df]))
|
||||
|
||||
(def max-sequence-length 100000)
|
||||
|
||||
(defn infinite-sequence-chunking [s]
|
||||
(cond-> (take max-sequence-length s)
|
||||
(< max-sequence-length (bounded-count (inc max-sequence-length) s))
|
||||
(vary-meta merge (meta s) {:nextjournal.seq/truncated? true})))
|
||||
|
||||
(extend-protocol p/Datafiable
|
||||
clojure.lang.LazySeq
|
||||
(df/datafy [s] (infinite-sequence-chunking s))
|
||||
clojure.lang.Iterate
|
||||
(df/datafy [s] (infinite-sequence-chunking s))
|
||||
clojure.lang.Repeat
|
||||
(df/datafy [s] (infinite-sequence-chunking s))
|
||||
clojure.lang.Cycle
|
||||
(df/datafy [s] (infinite-sequence-chunking s)))
|
||||
|
||||
(defn safe-datafy [x]
|
||||
(let [dtf (cond-> x
|
||||
(not (instance? clojure.lang.IRef x))
|
||||
df/datafy)]
|
||||
(cond-> dtf
|
||||
(instance? clojure.lang.IObj dtf)
|
||||
(vary-meta (fn [m] (merge (dissoc m :clojure.datafy/class :clojure.datafy/obj)
|
||||
(meta x)))))))
|
||||
|
||||
[(safe-datafy (range))
|
||||
(safe-datafy (repeat 1))]")))
|
||||
Loading…
Reference in a new issue