babashka/test/babashka/protocols_test.clj
Michiel Borkent 76dd775991 Protocol test
2020-11-11 00:00:17 +01:00

42 lines
1.4 KiB
Clojure

(ns babashka.protocols-test
(:require [babashka.test-utils :refer [bb]]
[clojure.edn :as edn]
[clojure.test :as t :refer [deftest is]]))
(deftest safe-datafy
(is (apply = 100000 (map count (edn/read-string (bb nil "
(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.Cons
(df/datafy [s] (infinite-sequence-chunking s))
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)))))))
[(doall (safe-datafy (range)))
(doall (safe-datafy (repeat 1)))
(doall (safe-datafy (cons -1 (range))))]"))))))