yoko-0.3.1.3: Data/Yoko/View.hs
{-# LANGUAGE TypeFamilies, TypeOperators, FlexibleContexts,
MultiParamTypeClasses, FlexibleInstances, ConstraintKinds,
UndecidableInstances #-}
{- |
Module : Data.Yoko.View
Copyright : (c) The University of Kansas 2011
License : BSD3
Maintainer : nicolas.frisby@gmail.com
Stability : experimental
Portability : see LANGUAGE pragmas (... GHC)
The @yoko@ generic view.
-}
module Data.Yoko.View
(-- * Reflection
-- ** Fields types
Tag, Range, DC(..),
-- ** Disbanded data types
DCs, Disbanded, DT(..)
) where
import Data.Yoko.Representation
import Data.Yoko.TypeSums (Embed, Partition, (:-:))
import Data.Yoko.Each
-- | @Tag@ returns a simulated type-level string that is the name of the
-- constructor that the @dc@ fields type represents.
type family Tag dc
-- | @Range@ is the data type that contains the constructor that the fields
-- type @dc@ represents.
type family Range dc
-- | Any fields type can be further represented as a product-of-fields and can
-- be injected back into the original data type.
class (Generic dc, DT (Range dc)) => DC dc where rejoin :: dc -> Range dc
-- | The @DCs@ of a data type is sum of all of its fields types.
type family DCs t
-- | A disbanded data type is the data type's @DCs@ annotated with it.
type Disbanded t = DCsOf t (DCs t)
-- | @DT@ disbands a data type if all of its fields types have @DC@ instances.
class Each IsDCOf (DCs t) => DT t where disband :: t -> Disbanded t
class (Partition (DCs (Range dc)) (N dc) (DCs (Range dc) :-: N dc),
Embed (N dc) (DCs (Range dc))) => IsDCOf dc
instance (Partition (DCs (Range dc)) (N dc) (DCs (Range dc) :-: N dc),
Embed (N dc) (DCs (Range dc))) => IsDCOf dc