EMGM is a general-purpose library for datatype-generic programming.

The design is based on the idea of modeling algebraic datatypes as
sum-of-product structures. Many datatypes can be modeled this way, and
because they all share a common structure, we can write generic functions that
work on this structure.

The primary features of the library are:

*A foundation for building generic functions.* EMGM includes a collection of
datatypes (e.g. sum, product, and unit) and type classes (e.g. `Generic`

and
`Rep`

). Everything you need for defining generic functions and supporting
datatypes can be found here.

*Many useful generic functions.* These provide a wide range of
functionality. For example, there is `crush`

, a generalization of the
foldl/foldr functions, that allows you to flexibly extract the elements of a
polymorphic container. Now, you can do many of the operations with your
container that were previously only available for lists.

*Support for standard datatypes.* EMGM supports standard types: primitives
(e.g. `Int`

and `Float`

), `Bool`

, lists, tuples, `Maybe`

, etc.

*NOTE:* As of version 0.4, this library does not have Template Haskell for
generating the representation. We are working on another library for a
solution to this problem.