-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Emulation of type-level functions
--
-- This package supports emulation of type-level functions using
-- defunctionalization. All functions whose domain is a subkind of
-- * and whose codomain is * itself can be represented.
--
-- For detailed information, please refer to Subsection 3.2 of the paper
-- Generic Record Combinators with Static Type Checking.
@package type-functions
@version 0.2.0.3
-- | Emulation of type-level functions.
module Data.TypeFun
-- | Type-level functions are represented by types. TypeFun is the
-- class of all type-level function representations.
class Kind (Domain fun) => TypeFun fun where { type family Domain fun; }
-- | Application of type-level functions. App takes a function
-- representation and an argument and returns the corresponding result.
-- | A type Id d represents the type-level identity
-- function whose domain is represented by d.
data Id dom
Id :: dom -> Id dom
-- | A type Const d v represents the constant
-- type-level function whose domain is represented by d,
-- and whose result is v.
data Const dom val
Const :: dom -> Const dom val
-- | A type f :-> f' represents the type-level
-- function \arg -> (App f arg -> App
-- f' arg).
data (:->) fun fun'
(:->) :: fun -> fun' -> :-> fun fun'
-- | If t is a type of kind * -> *, and
-- f is the representation of a type-level function,
-- FunMap t f represents the function \arg
-- -> t (App f arg).
data FunMap trans :: (* -> *) fun
-- | A data type that is isomorphic to the type synonym family App.
newtype WrappedApp fun arg
WrapApp :: (App fun arg) -> WrappedApp fun arg
-- | The inverse of WrapApp.
unwrapApp :: WrappedApp fun arg -> App fun arg
-- | Turns a type-level function into the intersection of all its results.
type Universal fun = forall arg. Inhabitant (Domain fun) arg => WrappedApp fun arg
instance TypeFun fun => TypeFun (FunMap trans fun)
instance (Domain fun ~ Domain fun', TypeFun fun, TypeFun fun') => TypeFun (fun :-> fun')
instance Kind dom => TypeFun (Const dom val)
instance Kind dom => TypeFun (Id dom)