|
30 | 30 |
|
31 | 31 | ;; map destructuring |
32 | 32 |
|
33 | | -(s/def ::keys (s/coll-of ident? :kind vector?)) |
34 | | -(s/def ::syms (s/coll-of symbol? :kind vector?)) |
35 | | -(s/def ::strs (s/coll-of simple-symbol? :kind vector?)) |
36 | | -(s/def ::or (s/map-of simple-symbol? any?)) |
| 33 | +(s/def ::non-binding-elements (s/cat :ampersand #{'&} ::non-binding-element (s/+ any?))) |
| 34 | +(s/def ::keys-form (s/and vector? (s/cat :bindings (s/* ident?) :nonbinding (s/? ::non-binding-elements)))) |
| 35 | +(s/def ::syms-form (s/and vector? (s/cat :bindings (s/* symbol?) :nonbinding (s/? ::non-binding-elements)))) |
| 36 | +(s/def ::simple-syms-form (s/and vector? (s/cat :bindings (s/* simple-symbol?) :nonbinding (s/? ::non-binding-elements)))) |
| 37 | + |
| 38 | +(s/def ::keys ::keys-form) |
| 39 | +(s/def ::syms ::syms-form) |
| 40 | +(s/def ::strs ::simple-syms-form) |
| 41 | +(s/def ::keys! ::keys-form) |
| 42 | +(s/def ::syms! ::syms-form) |
| 43 | +(s/def ::strs! ::simple-syms-form) |
| 44 | +(s/def ::or map?) |
37 | 45 | (s/def ::as ::local-name) |
| 46 | +(s/def ::defaults ::local-name) |
| 47 | +(s/def ::select ::local-name) |
| 48 | +(s/def ::all ::local-name) |
38 | 49 |
|
39 | 50 | (s/def ::map-special-binding |
40 | | - (s/keys :opt-un [::as ::or ::keys ::syms ::strs])) |
| 51 | + (s/keys :opt-un [::as ::or ::keys ::syms ::strs ::keys! ::syms! ::strs! ::select ::defaults ::all])) |
41 | 52 |
|
42 | 53 | (s/def ::map-binding (s/tuple ::binding-form any?)) |
43 | 54 |
|
44 | 55 | (s/def ::ns-keys |
45 | 56 | (s/tuple |
46 | | - (s/and qualified-keyword? #(-> % name #{"keys" "syms"})) |
47 | | - (s/coll-of simple-symbol? :kind vector?))) |
| 57 | + (s/and qualified-keyword? #(-> % name #{"keys" "syms" "keys!" "syms!"})) |
| 58 | + ::simple-syms-form)) |
48 | 59 |
|
49 | 60 | (s/def ::map-bindings |
50 | 61 | (s/every (s/or :map-binding ::map-binding |
51 | 62 | :qualified-keys-or-syms ::ns-keys |
52 | | - :special-binding (s/tuple #{:as :or :keys :syms :strs} any?)) :kind map?)) |
| 63 | + :special-binding (s/tuple #{:as :or :keys :syms :strs :keys! :syms! :strs! :select :defaults :all} any?)) |
| 64 | + :kind map?)) |
53 | 65 |
|
54 | 66 | (s/def ::map-binding-form (s/merge ::map-bindings ::map-special-binding)) |
55 | 67 |
|
|
0 commit comments