wip [skip ci]

This commit is contained in:
Michiel Borkent 2022-04-03 16:41:12 +02:00
parent 2d5424949a
commit 388edf7b8c
2 changed files with 38 additions and 18 deletions

View file

@ -25,7 +25,7 @@
the registry for k." the registry for k."
[_ _ k spec-form] [_ _ k spec-form]
(let [k (if (symbol? k) (ns-qualify k) k)] (let [k (if (symbol? k) (ns-qualify k) k)]
`(clojure.spec.alpha/def-impl '~k '~(s/res spec-form) ~spec-form))) `(clojure.spec.alpha/def-impl '~k '~(#'s/res spec-form) ~spec-form)))
;; TODO: fix error in clj-kondo: def is a special form which should always be resolved as the special form ;; TODO: fix error in clj-kondo: def is a special form which should always be resolved as the special form
#_:clj-kondo/ignore #_:clj-kondo/ignore
@ -34,14 +34,34 @@
'def-impl (copy-var s/def-impl sns) 'def-impl (copy-var s/def-impl sns)
'valid? (copy-var s/valid? sns) 'valid? (copy-var s/valid? sns)
'gen (copy-var s/gen sns) 'gen (copy-var s/gen sns)
'* (copy-var s/* sns)
'rep-impl (copy-var s/rep-impl sns)
'+ (copy-var s/+ sns)
'rep+impl (copy-var s/rep+impl sns)
'? (copy-var s/? sns)
'maybe-impl (copy-var s/maybe-impl sns)
'& (copy-var s/& sns)
'amp-impl (copy-var s/amp-impl sns)
'and (copy-var s/and sns)
'and-spec-impl (copy-var s/and-spec-impl sns)
'or (copy-var s/or sns)
'or-spec-impl (copy-var s/or-spec-impl sns)
'cat (copy-var s/cat sns) 'cat (copy-var s/cat sns)
'cat-impl (copy-var s/cat-impl sns) 'cat-impl (copy-var s/cat-impl sns)
'alt (copy-var s/alt sns)
'alt-impl (copy-var s/alt-impl sns)
'fdef (copy-var s/fdef sns) 'fdef (copy-var s/fdef sns)
'fspec (copy-var s/fspec sns) 'fspec (copy-var s/fspec sns)
'fspec-impl (copy-var s/fspec-impl sns) 'fspec-impl (copy-var s/fspec-impl sns)
;; 372 'every (copy-var s/every sns)
'every-impl (copy-var s/every-impl sns)
'every-kv (copy-var s/every-kv sns)
'map-of (copy-var s/map-of sns)
'spec (copy-var s/spec sns) 'spec (copy-var s/spec sns)
'spec-impl (copy-var s/spec-impl sns) 'spec-impl (copy-var s/spec-impl sns)
'tuple (copy-var s/tuple sns)
'tuple-impl (copy-var s/tuple-impl sns)
'conformer (copy-var s/conformer sns)
#_#_'explain-data (copy-var s/explain-data sns)}) #_#_'explain-data (copy-var s/explain-data sns)})
#_:clj-kondo/ignore #_:clj-kondo/ignore

View file

@ -494,7 +494,7 @@
pred-forms (mapv second pairs) pred-forms (mapv second pairs)
pf (mapv res pred-forms)] pf (mapv res pred-forms)]
(c/assert (c/and (even? (count key-pred-forms)) (every? keyword? keys)) "spec/or expects k1 p1 k2 p2..., where ks are keywords") (c/assert (c/and (even? (count key-pred-forms)) (every? keyword? keys)) "spec/or expects k1 p1 k2 p2..., where ks are keywords")
`(or-spec-impl ~keys '~pf ~pred-forms nil))) `(clojure.spec.alpha/or-spec-impl ~keys '~pf ~pred-forms nil)))
(defmacro and (defmacro and
"Takes predicate/spec-forms, e.g. "Takes predicate/spec-forms, e.g.
@ -504,7 +504,7 @@
Returns a spec that returns the conformed value. Successive Returns a spec that returns the conformed value. Successive
conformed values propagate through rest of predicates." conformed values propagate through rest of predicates."
[& pred-forms] [& pred-forms]
`(and-spec-impl '~(mapv res pred-forms) ~(vec pred-forms) nil)) `(clojure.spec.alpha/and-spec-impl '~(mapv res pred-forms) ~(vec pred-forms) nil))
(defmacro merge (defmacro merge
"Takes map-validating specs (e.g. 'keys' specs) and "Takes map-validating specs (e.g. 'keys' specs) and
@ -569,7 +569,7 @@
distinct distinct
(conj `(c/or (empty? ~gx) (apply distinct? ~gx))))] (conj `(c/or (empty? ~gx) (apply distinct? ~gx))))]
`(every-impl '~pred ~pred ~(assoc nopts ::cpred `(fn* [~gx] (c/and ~@cpreds))) ~gen))) `(clojure.spec.alpha/every-impl '~pred ~pred ~(assoc nopts ::cpred `(fn* [~gx] (c/and ~@cpreds))) ~gen)))
(defmacro every-kv (defmacro every-kv
"like 'every' but takes separate key and val preds and works on associative collections. "like 'every' but takes separate key and val preds and works on associative collections.
@ -579,8 +579,8 @@
See also - map-of" See also - map-of"
[kpred vpred & opts] [kpred vpred & opts]
(let [desc `(every-kv ~(res kpred) ~(res vpred) ~@(res-kind opts))] (let [desc `(clojure.spec.alpha/every-kv ~(res kpred) ~(res vpred) ~@(res-kind opts))]
`(every (tuple ~kpred ~vpred) ::kfn (fn [i# v#] (nth v# 0)) :into {} ::describe '~desc ~@opts))) `(clojure.spec.alpha/every (clojure.spec.alpha/tuple ~kpred ~vpred) ::kfn (fn [i# v#] (nth v# 0)) :into {} ::describe '~desc ~@opts)))
(defmacro coll-of (defmacro coll-of
"Returns a spec for a collection of items satisfying pred. Unlike "Returns a spec for a collection of items satisfying pred. Unlike
@ -606,27 +606,27 @@
See also - every-kv" See also - every-kv"
[kpred vpred & opts] [kpred vpred & opts]
(let [desc `(map-of ~(res kpred) ~(res vpred) ~@(res-kind opts))] (let [desc `(clojure.spec.alpha/map-of ~(res kpred) ~(res vpred) ~@(res-kind opts))]
`(every-kv ~kpred ~vpred ::conform-all true :kind map? ::describe '~desc ~@opts))) `(clojure.spec.alpha/every-kv ~kpred ~vpred ::conform-all true :kind map? ::describe '~desc ~@opts)))
(defmacro * (defmacro *
"Returns a regex op that matches zero or more values matching "Returns a regex op that matches zero or more values matching
pred. Produces a vector of matches iff there is at least one match" pred. Produces a vector of matches iff there is at least one match"
[pred-form] [pred-form]
`(rep-impl '~(res pred-form) ~pred-form)) `(clojure.spec.alpha/rep-impl '~(res pred-form) ~pred-form))
(defmacro + (defmacro +
"Returns a regex op that matches one or more values matching "Returns a regex op that matches one or more values matching
pred. Produces a vector of matches" pred. Produces a vector of matches"
[pred-form] [pred-form]
`(rep+impl '~(res pred-form) ~pred-form)) `(clojure.spec.alpha/rep+impl '~(res pred-form) ~pred-form))
(defmacro ? (defmacro ?
"Returns a regex op that matches zero or one value matching "Returns a regex op that matches zero or one value matching
pred. Produces a single value (not a collection) if matched." pred. Produces a single value (not a collection) if matched."
[pred-form] [pred-form]
`(maybe-impl ~pred-form '~(res pred-form))) `(clojure.spec.alpha/maybe-impl ~pred-form '~(res pred-form)))
(defmacro alt (defmacro alt
"Takes key+pred pairs, e.g. "Takes key+pred pairs, e.g.
@ -643,7 +643,7 @@
pred-forms (mapv second pairs) pred-forms (mapv second pairs)
pf (mapv res pred-forms)] pf (mapv res pred-forms)]
(c/assert (c/and (even? (count key-pred-forms)) (every? keyword? keys)) "alt expects k1 p1 k2 p2..., where ks are keywords") (c/assert (c/and (even? (count key-pred-forms)) (every? keyword? keys)) "alt expects k1 p1 k2 p2..., where ks are keywords")
`(alt-impl ~keys ~pred-forms '~pf))) `(clojure.spec.alpha/alt-impl ~keys ~pred-forms '~pf)))
(defmacro cat (defmacro cat
"Takes key+pred pairs, e.g. "Takes key+pred pairs, e.g.
@ -667,15 +667,15 @@
conjunction of the predicates, and any conforming they might perform." conjunction of the predicates, and any conforming they might perform."
[re & preds] [re & preds]
(let [pv (vec preds)] (let [pv (vec preds)]
`(amp-impl ~re '~(res re) ~pv '~(mapv res pv)))) `(clojure.spec.alpha/amp-impl ~re '~(res re) ~pv '~(mapv res pv))))
(defmacro conformer (defmacro conformer
"takes a predicate function with the semantics of conform i.e. it should return either a "takes a predicate function with the semantics of conform i.e. it should return either a
(possibly converted) value or :clojure.spec.alpha/invalid, and returns a (possibly converted) value or :clojure.spec.alpha/invalid, and returns a
spec that uses it as a predicate/conformer. Optionally takes a spec that uses it as a predicate/conformer. Optionally takes a
second fn that does unform of result of first" second fn that does unform of result of first"
([f] `(spec-impl '(conformer ~(res f)) ~f nil true)) ([f] `(clojure.spec.alpha/spec-impl '(conformer ~(res f)) ~f nil true))
([f unf] `(spec-impl '(conformer ~(res f) ~(res unf)) ~f nil true ~unf))) ([f unf] `(clojure.spec.alpha/spec-impl '(conformer ~(res f) ~(res unf)) ~f nil true ~unf)))
(defmacro fspec (defmacro fspec
"takes :args :ret and (optional) :fn kwargs whose values are preds "takes :args :ret and (optional) :fn kwargs whose values are preds
@ -704,7 +704,7 @@
will be referred to in paths using its ordinal." will be referred to in paths using its ordinal."
[& preds] [& preds]
(c/assert (not (empty? preds))) (c/assert (not (empty? preds)))
`(tuple-impl '~(mapv res preds) ~(vec preds))) `(clojure.spec.alpha/tuple-impl '~(mapv res preds) ~(vec preds)))
(defn- macroexpand-check (defn- macroexpand-check
[v args] [v args]
@ -1060,7 +1060,7 @@
(when (every? identity gs) (when (every? identity gs)
(apply gen/tuple gs))))) (apply gen/tuple gs)))))
(with-gen* [_ gfn] (tuple-impl forms preds gfn)) (with-gen* [_ gfn] (tuple-impl forms preds gfn))
(describe* [_] `(tuple ~@forms)))))) (describe* [_] `(clojure.spec.alpha/tuple ~@forms))))))
(defn- tagged-ret [tag ret] (defn- tagged-ret [tag ret]
(clojure.lang.MapEntry. tag ret)) (clojure.lang.MapEntry. tag ret))