module Language.HERMIT.Kure.SumTypes
(
Core(..)
, TyCo(..)
, CoreTC(..)
)
where
import GhcPlugins
import Language.KURE.Injection
import Language.HERMIT.Core
data Core = GutsCore ModGuts
| ProgCore CoreProg
| BindCore CoreBind
| DefCore CoreDef
| ExprCore CoreExpr
| AltCore CoreAlt
data TyCo = TypeCore Type
| CoercionCore Coercion
data CoreTC = Core Core
| TyCo TyCo
instance Injection ModGuts Core where
inject :: ModGuts -> Core
inject = GutsCore
project :: Core -> Maybe ModGuts
project (GutsCore guts) = Just guts
project _ = Nothing
instance Injection CoreProg Core where
inject :: CoreProg -> Core
inject = ProgCore
project :: Core -> Maybe CoreProg
project (ProgCore bds) = Just bds
project _ = Nothing
instance Injection CoreBind Core where
inject :: CoreBind -> Core
inject = BindCore
project :: Core -> Maybe CoreBind
project (BindCore bnd) = Just bnd
project _ = Nothing
instance Injection CoreDef Core where
inject :: CoreDef -> Core
inject = DefCore
project :: Core -> Maybe CoreDef
project (DefCore def) = Just def
project _ = Nothing
instance Injection CoreAlt Core where
inject :: CoreAlt -> Core
inject = AltCore
project :: Core -> Maybe CoreAlt
project (AltCore expr) = Just expr
project _ = Nothing
instance Injection CoreExpr Core where
inject :: CoreExpr -> Core
inject = ExprCore
project :: Core -> Maybe CoreExpr
project (ExprCore expr) = Just expr
project _ = Nothing
instance Injection Type TyCo where
inject :: Type -> TyCo
inject = TypeCore
project :: TyCo -> Maybe Type
project (TypeCore ty) = Just ty
project _ = Nothing
instance Injection Coercion TyCo where
inject :: Coercion -> TyCo
inject = CoercionCore
project :: TyCo -> Maybe Coercion
project (CoercionCore ty) = Just ty
project _ = Nothing
instance Injection Core CoreTC where
inject :: Core -> CoreTC
inject = Core
project :: CoreTC -> Maybe Core
project (Core core) = Just core
project _ = Nothing
instance Injection TyCo CoreTC where
inject :: TyCo -> CoreTC
inject = TyCo
project :: CoreTC -> Maybe TyCo
project (TyCo tyCo) = Just tyCo
project _ = Nothing
instance Injection ModGuts CoreTC where
inject :: ModGuts -> CoreTC
inject = Core . GutsCore
project :: CoreTC -> Maybe ModGuts
project (Core (GutsCore guts)) = Just guts
project _ = Nothing
instance Injection CoreProg CoreTC where
inject :: CoreProg -> CoreTC
inject = Core . ProgCore
project :: CoreTC -> Maybe CoreProg
project (Core (ProgCore bds)) = Just bds
project _ = Nothing
instance Injection CoreBind CoreTC where
inject :: CoreBind -> CoreTC
inject = Core . BindCore
project :: CoreTC -> Maybe CoreBind
project (Core (BindCore bnd)) = Just bnd
project _ = Nothing
instance Injection CoreDef CoreTC where
inject :: CoreDef -> CoreTC
inject = Core . DefCore
project :: CoreTC -> Maybe CoreDef
project (Core (DefCore def)) = Just def
project _ = Nothing
instance Injection CoreAlt CoreTC where
inject :: CoreAlt -> CoreTC
inject = Core . AltCore
project :: CoreTC -> Maybe CoreAlt
project (Core (AltCore expr)) = Just expr
project _ = Nothing
instance Injection CoreExpr CoreTC where
inject :: CoreExpr -> CoreTC
inject = Core . ExprCore
project :: CoreTC -> Maybe CoreExpr
project (Core (ExprCore expr)) = Just expr
project _ = Nothing
instance Injection Type CoreTC where
inject :: Type -> CoreTC
inject = TyCo . TypeCore
project :: CoreTC -> Maybe Type
project (TyCo (TypeCore ty)) = Just ty
project _ = Nothing
instance Injection Coercion CoreTC where
inject :: Coercion -> CoreTC
inject = TyCo . CoercionCore
project :: CoreTC -> Maybe Coercion
project (TyCo (CoercionCore ty)) = Just ty
project _ = Nothing