Data.TrieMap.Representation
Documentation
The Repr type class denotes that a type can be decomposed to a representation
built out of pieces for which the TrieKey class defines a generalized trie structure.
It is required that, if (, and Repr a, Eq a)x, y :: a, then x
if and only if == y. It is typically the case that
toRep x == toRep y, as well, but this is not
strictly required. (It is, however, the case for all instances built into the package.)
compare x y == compare (toRep x) (toRep y)
As an additional note, the Key modifier is used for "bootstrapping" Repr instances,
allowing a type to be used in its own Repr definition when wrapped in a Key modifier.
Instances
genRepr :: Name -> Q [Dec]Source
Given the name of a type constructor, automatically generates an efficient Repr instance.
If you have several mutually dependent (or even mutually recursive) types, genRepr will
construct instances for all of them.
genRepr guarantees that any instances it generates are consistent with the ordering that
would be generated by deriving ( in the data declaration. That is, if Ord)genRepr
generates an instance Repr a, then it is guaranteed that if x, y :: a, and a
has a derived Ord instance, then compare x y == compare (toRep x) (toRep y).
genOptRepr :: Name -> Q [Dec]Source
Given the name of a type constructor, automatically generates an efficient Repr instance.
If you have several mutually dependent (or even mutually recursive) types, genOptRepr will
construct instances for all of them. The instance generated by genOptRepr may, in some
cases, be more efficient than the instance generated by genRepr -- in particular,
arguments common to several constructors may be factored out, reducing the complexity of the
associated TrieKey instance, but leaving an ordering inconsistent with Ord.
Therefore, genOptRepr guarantees that any instances it generates are consistent with the
ordering that would be generated by deriving ( in the data declaration. That is, if
Eq)genOptRepr generates an instance Repr a, then it is guaranteed that if x, y :: a, and
a has a derived Eq instance, then (x == y) == (toRep x == toRep y).