The Datum class describes a record that has a significant value (the datum)
and possibly additional information (metadata) about that value.
The purpose of the class is to allow components of a system to
pass metadata through other components which are only aware of the datum type.
The Identity functor from the Transformers package is the Datum instance
where the test requires no additional information or meta-data.
\begin{code}
module Test.GenCheck.Base.Datum (Datum(..)) where
import Data.Functor.Identity
class Datum t where
type DataType t :: *
datum :: t -> DataType t
instance Datum (Identity a) where
type DataType (Identity a) = a
datum = runIdentity
\end{code}