structural-typing.assist.lifting
Lifting is a core concept, though one only writers of fairly unusual custom predicates need worry about.
A predicate begins as something that takes a value and returns a truthy/falsey value. It is lifted into something that takes an exval (extended value) and returns a (possibly empty) sequence of oopsies. Condensed type descriptions are similarly converted into single functions that return oopsies.
lift-pred
(lift-pred pred & protection-subtractions)Convert a predicate into a function that produces either an empty sequence or a vector containing an oopsie describing the failure of the predicate. However, nothing is done to an already-lifted predicate.
Normally, the predicate is wrapped so that (1) a nil value is considered true, and (2) an exception during evaluation is considered false. These can be omitted with the :check-nil and :allow-exceptions protection-subtractions.
The lifted predicate takes an exval as its argument.
lift-type
(lift-type condensed-type-descriptions type-map)(lift-type condensed-type-descriptions)Take a collection of condensed type descriptions. Canonicalize them. Convert the result into a function that returns oopsies.
The type-map is not a type-repo as given to named or type!. It is rather a plain map from type signifiers to type descriptions. It can be obtained by a type-repo with (:canonicalized-type-descriptions type-repo).
mark-as-lifted
(mark-as-lifted pred)A pred so marked is not lifted again. You can call lift-pred safely many times.