(defmacro tuple
"takes one or more preds and returns a spec for a tuple, a vector
where each element conforms to the corresponding pred. Each element
will be referred to in paths using its ordinal."
[& preds]
(c/assert (not (empty? preds)))
`(tuple-impl '~(mapv res preds) ~(vec preds)))