rel8-1.0.0.0: src/Rel8/Kind/Context.hs
{-# language DataKinds #-}
{-# language GADTs #-}
{-# language LambdaCase #-}
{-# language StandaloneKindSignatures #-}
module Rel8.Kind.Context
( Reifiable( contextSing )
, SContext(..)
, sReifiable
, sLabelable
)
where
-- base
import Data.Kind ( Constraint, Type )
import Prelude ()
-- rel8
import Rel8.Aggregate ( Aggregate )
import Rel8.Expr ( Expr )
import Rel8.Schema.Dict ( Dict( Dict ) )
import Rel8.Schema.Context ( Interpretation )
import Rel8.Schema.Context.Label ( Labelable )
import Rel8.Schema.Kind ( Context )
import Rel8.Schema.Name ( Name )
import Rel8.Schema.Reify ( Reify )
import Rel8.Schema.Result ( Result )
type SContext :: Context -> Type
data SContext context where
SAggregate :: SContext Aggregate
SExpr :: SContext Expr
SName :: SContext Name
SResult :: SContext Result
SReify :: SContext context -> SContext (Reify context)
type Reifiable :: Context -> Constraint
class Interpretation context => Reifiable context where
contextSing :: SContext context
instance Reifiable Aggregate where
contextSing = SAggregate
instance Reifiable Expr where
contextSing = SExpr
instance Reifiable Result where
contextSing = SResult
instance Reifiable Name where
contextSing = SName
instance Reifiable context => Reifiable (Reify context) where
contextSing = SReify contextSing
sReifiable :: SContext context -> Dict Reifiable context
sReifiable = \case
SAggregate -> Dict
SExpr -> Dict
SName -> Dict
SResult -> Dict
SReify context -> case sReifiable context of
Dict -> Dict
sLabelable :: SContext context -> Dict Labelable context
sLabelable = \case
SAggregate -> Dict
SExpr -> Dict
SName -> Dict
SResult -> Dict
SReify context -> case sLabelable context of
Dict -> Dict