80 lines
2.4 KiB
Clojure
80 lines
2.4 KiB
Clojure
(ns babashka.proxy-test
|
|
(:require
|
|
[babashka.test-utils :as test-utils]
|
|
[clojure.edn :as edn]
|
|
[clojure.test :as test :refer [deftest is]]))
|
|
|
|
(defn bb [& args]
|
|
(edn/read-string
|
|
{:readers *data-readers*
|
|
:eof nil}
|
|
(apply test-utils/bb nil (map str args))))
|
|
|
|
(def code
|
|
'(do
|
|
(require '[clojure.core.protocols])
|
|
(require '[clojure.datafy :as d])
|
|
(defn auto-deref
|
|
"If value implements IDeref, deref it, otherwise return original."
|
|
[x]
|
|
(if (instance? clojure.lang.IDeref x)
|
|
@x
|
|
x))
|
|
(defn proxy-deref-map
|
|
{:added "1.0"}
|
|
[m]
|
|
(proxy [clojure.lang.APersistentMap clojure.lang.IMeta clojure.lang.IObj clojure.core.protocols.Datafiable]
|
|
[]
|
|
(iterator []
|
|
::TODO)
|
|
(containsKey [k] (contains? m k))
|
|
(entryAt [k] (when (contains? m k) (proxy [clojure.lang.AMapEntry] []
|
|
(key [] k)
|
|
(val [] (auto-deref (get m k))))))
|
|
(valAt ([k] (auto-deref (get m k)))
|
|
([k default] (auto-deref (get m k default))))
|
|
(cons [v] (proxy-deref-map (conj m v)))
|
|
(count [] (count m))
|
|
(assoc [k v] (proxy-deref-map (assoc m k v)))
|
|
(without [k] (proxy-deref-map (dissoc m k)))
|
|
(seq [] (map (fn [[k v]](proxy [clojure.lang.AMapEntry] []
|
|
(key [] k)
|
|
(val [] (auto-deref (get m k))))) m))
|
|
(withMeta [md] (proxy-deref-map (with-meta m md)))
|
|
(meta [] (meta m))
|
|
|
|
(datafy [] {:datafied true})))
|
|
(let [m (proxy-deref-map
|
|
{:a (delay 1)
|
|
:b (delay 2)
|
|
:c 3})]
|
|
[(:a m)
|
|
(:b m)
|
|
(:c m)
|
|
(contains? m :c)
|
|
(find m :c)
|
|
(-> (conj m [:d (delay 5)])
|
|
:d)
|
|
(count m)
|
|
(-> (assoc m :d (delay 5))
|
|
:d)
|
|
(-> (dissoc m :a)
|
|
(contains? :a))
|
|
(seq m)
|
|
(meta (with-meta m {:a 1}))
|
|
(d/datafy m)
|
|
(instance? clojure.lang.APersistentMap m)
|
|
(instance? java.io.FilenameFilter m)
|
|
,])))
|
|
|
|
(require 'clojure.pprint)
|
|
|
|
(deftest APersistentMap-proxy-test
|
|
(is (= [1 2 3 true [:c 3]
|
|
5 3 5 false
|
|
'([:a 1] [:b 2] [:c 3])
|
|
{:a 1}
|
|
{:datafied true}
|
|
true
|
|
false]
|
|
(bb (with-out-str (clojure.pprint/pprint code))))))
|