(defn
explain-data
"Given a spec and a value x which ought to conform, returns nil if x\n conforms, else a map with at least the key ::problems whose value is\n a collection of problem-maps, where problem-map has at least :path :pred and :val\n keys describing the predicate and the value that failed at that\n path."
[spec x]
(explain-data*
spec
[]
(if-let [name (spec-name spec)] [name] [])
[]
x))