# strongweak Definitions for transforming between types. * `strong -> weak` drops invariants (e.g. going from a bounded to an unbounded numeric type) * `weak -> Maybe strong` introduces invariants This is not a `Convertible` library that enumerates transformations between types into a dictionary. * A "strong" type has exactly one "weak" representation. * Weakening a type is safe. * Strengthening a type may fail. There are generic derivers for generating `Strengthen` and `Weaken` instances for arbitrary data types. The `Strengthen` instances annotate errors extensively, telling you the datatype & record for which strengthening failed - recursively, for nested types. This is a validation library. We don't fail on the first error -- we attempt to validate every part of a data type, and collate the errors into a list. This happens magically in the generic deriver, but if you're writing your own instances, you may want `ApplicativeDo` so you can use do notation. So it'll monadic, but actually everything will get checked.