|
667 | 667 | (core/defn ^:private destmap* |
668 | 668 | [pb bvec b v] |
669 | 669 | (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))))] |
671 | 719 | (core/loop [ret (core/-> bvec (conj gmap) (conj v) |
672 | 720 | (conj gmap) (conj `(--destructure-map ~gmap)) |
673 | 721 | ((core/fn [ret] |
|
0 commit comments