Skip to content

Commit 6396989

Browse files
committed
(wip)
1 parent eb1eb67 commit 6396989

1 file changed

Lines changed: 49 additions & 1 deletion

File tree

src/main/clojure/cljs/core.cljc

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,55 @@
667667
(core/defn ^:private destmap*
668668
[pb bvec b v]
669669
(core/let [gmap (gensym "map__")
670-
defaults (:or b)]
670+
gignore (gensym "ignore__")
671+
defaults (:or b)
672+
defaults-as (:defaults b)
673+
_ (core/when (core/and defaults-as (not defaults))
674+
(throw (new js/Error "Can't specify :defaults without :or")))
675+
b (dissoc b :defaults)
676+
gdefaults (core/when defaults (zipmap (keys defaults) (repeatedly #(gensym "default__"))))
677+
select (:select b)
678+
all (:all b)
679+
xf (core/fn [mk]
680+
(core/let [mkns (namespace mk)
681+
mkn (name mk)]
682+
(core/cond
683+
(.startsWith mkn "keys") #(keyword (core/or mkns (namespace %)) (name %))
684+
(.startsWith mkn "syms") #(core/list `quote (symbol (core/or mkns (namespace %)) (name %)))
685+
(.startsWith mkn "strs") core/str
686+
:else (throw (new js/Error (core/str "Unsupported map directive: " mk))))))
687+
ret (reduce (core/fn [ret e]
688+
(conj ret (val e) (defaults (key e))))
689+
bvec defaults)
690+
ret (core/-> ret (conj gmap) (conj v)
691+
(conj gmap)
692+
(conj `(--destructure-map ~gmap))
693+
((core/fn [ret]
694+
(if (:as b)
695+
(conj ret (:as b) gmap)
696+
ret))))
697+
bes (dissoc b :as :or :select :all)
698+
localize (core/fn [bb]
699+
(if #?(:clj (core/instance? clojure.lang.Named bb)
700+
:cljs (cljs.core/implements? INamed bb))
701+
(with-meta (symbol nil (name bb)) (meta bb)) bb))
702+
push1 (core/fn [ret bb bk req?]
703+
(core/let [getter (if req? `req! `get)
704+
local (localize bb)
705+
local-default? (contains? defaults local)
706+
key-default? (contains? defaults bk)
707+
bv (if (core/or local-default? key-default?)
708+
(if (core/and local-default? key-default?)
709+
(throw (new js/Error
710+
(core/str "Multiple :or defaults for same key: " bk " '" "'")))
711+
(if req?
712+
(throw (new js/Error
713+
(core/str "Can't supply default value for required key: " bk)))
714+
(core/list `get gmap bk (if local-default? (gdefaults local) (gdefaults bk)))))
715+
(core/list getter gmap gmap bk))]
716+
(if (ident? bb)
717+
(core/-> ret (conj local bv))
718+
(pb ret bb bv))))]
671719
(core/loop [ret (core/-> bvec (conj gmap) (conj v)
672720
(conj gmap) (conj `(--destructure-map ~gmap))
673721
((core/fn [ret]

0 commit comments

Comments
 (0)