{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UndecidableInstances #-}
module Cubix.Language.Parametric.Syntax.VarDecl (
IdentL
, Ident(..)
, pattern Ident'
, iIdent
, jIdent
, MultiLocalVarDeclCommonAttrsL
, LocalVarInitL
, IsOptional(..)
, OptLocalVarInitL
, OptLocalVarInit(..)
, LocalVarDeclAttrsL
, TupleBinder(..)
, IdentIsVarDeclBinder(..)
, EmptyLocalVarDeclAttrs(..)
, VarDeclBinderL
, SingleLocalVarDeclL
, SingleLocalVarDecl(..)
, EmptyMultiLocalVarDeclCommonAttrs
, MultiLocalVarDeclL
, MultiLocalVarDecl(..)
, pattern JustLocalVarInit'
, iJustLocalVarInit
, jJustLocalVarInit
, pattern NoLocalVarInit'
, iNoLocalVarInit
, jNoLocalVarInit
, pattern EmptyLocalVarDeclAttrs'
, iEmptyLocalVarDeclAttrs
, jEmptyLocalVarDeclAttrs
, pattern TupleBinder'
, iTupleBinder
, jTupleBinder
, pattern IdentIsVarDeclBinder'
, iIdentIsVarDeclBinder
, jIdentIsVarDeclBinder
, pattern SingleLocalVarDecl'
, iSingleLocalVarDecl
, jSingleLocalVarDecl
, pattern EmptyMultiLocalVarDeclCommonAttrs'
, iEmptyMultiLocalVarDeclCommonAttrs
, jEmptyMultiLocalVarDeclCommonAttrs
, pattern MultiLocalVarDecl'
, iMultiLocalVarDecl
, jMultiLocalVarDecl
, AssignOpL
, AssignOpEquals(..)
, AssignOpAdd(..)
, AssignOpSub(..)
, AssignOpMul(..)
, AssignOpDiv(..)
, AssignOpMod(..)
, AssignOpBitAnd(..)
, AssignOpBitOr(..)
, AssignOpBitXor(..)
, AssignOpArithShr(..)
, AssignOpLogicShr(..)
, AssignOpShl(..)
, LhsL
, RhsL
, AssignL
, Assign(..)
, pattern AssignOpEquals'
, iAssignOpEquals
, jAssignOpEquals
, pattern AssignOpAdd'
, iAssignOpAdd
, jAssignOpAdd
, pattern AssignOpSub'
, iAssignOpSub
, jAssignOpSub
, pattern AssignOpMul'
, iAssignOpMul
, jAssignOpMul
, pattern AssignOpDiv'
, iAssignOpDiv
, jAssignOpDiv
, pattern AssignOpMod'
, iAssignOpMod
, jAssignOpMod
, pattern AssignOpBitAnd'
, iAssignOpBitAnd
, jAssignOpBitAnd
, pattern AssignOpBitOr'
, iAssignOpBitOr
, jAssignOpBitOr
, pattern AssignOpBitXor'
, iAssignOpBitXor
, jAssignOpBitXor
, pattern AssignOpArithShr'
, iAssignOpArithShr
, jAssignOpArithShr
, pattern AssignOpLogicShr'
, iAssignOpLogicShr
, jAssignOpLogicShr
, pattern AssignOpShl'
, iAssignOpShl
, jAssignOpShl
, pattern Assign'
, iAssign
, jAssign
, BlockItemL
, BlockEndL
, EmptyBlockEnd(..)
, BlockL
, Block(..)
, EmptyBlockItem(..)
, pattern EmptyBlockEnd'
, iEmptyBlockEnd
, jEmptyBlockEnd
, pattern Block'
, iBlock
, jBlock
, pattern EmptyBlockItem'
, iEmptyBlockItem
, jEmptyBlockItem
) where
import Data.Comp.Multi ( Node, project', HFunctor, (:-<:), All)
import Cubix.Language.Parametric.Derive
import Cubix.Language.Parametric.InjF
data IdentL
data Ident :: Node where
Ident :: String -> Ident e IdentL
deriveAll [''Ident]
data MultiLocalVarDeclCommonAttrsL
data LocalVarInitL
data IsOptional = Optional | NotOptional
data OptLocalVarInitL
data OptLocalVarInit e l where
JustLocalVarInit :: e LocalVarInitL -> OptLocalVarInit e OptLocalVarInitL
NoLocalVarInit :: OptLocalVarInit e OptLocalVarInitL
deriveAll [''OptLocalVarInit]
data LocalVarDeclAttrsL
data EmptyLocalVarDeclAttrs :: Node where
EmptyLocalVarDeclAttrs :: EmptyLocalVarDeclAttrs e LocalVarDeclAttrsL
deriveAll [''EmptyLocalVarDeclAttrs]
data VarDeclBinderL
data TupleBinder e l where
TupleBinder :: e [IdentL] -> TupleBinder e VarDeclBinderL
deriveAll [''TupleBinder]
instance (TupleBinder :-<: fs, All HFunctor fs) => InjF fs [IdentL] VarDeclBinderL where
injF :: forall h (a :: * -> *).
CxtS h fs a [IdentL] -> CxtS h fs a VarDeclBinderL
injF = CxtS h fs a [IdentL] -> CxtS h fs a VarDeclBinderL
forall h (fs :: Signature) (a :: * -> *) j.
(TupleBinder :-<: fs, InjF fs VarDeclBinderL j) =>
CxtS h fs a [IdentL] -> CxtS h fs a j
iTupleBinder
projF' :: forall h p (a :: * -> *).
Cxt h (Sum fs :&: p) a VarDeclBinderL
-> Maybe (Cxt h (Sum fs :&: p) a [IdentL])
projF' (Cxt h (Sum fs :&: p) a VarDeclBinderL
-> Maybe (TupleBinder (Cxt h (Sum fs :&: p) a) VarDeclBinderL)
forall (f :: (* -> *) -> * -> *) (f' :: (* -> *) -> * -> *)
(s :: (* -> *) -> * -> *) h (a :: * -> *) i.
(RemA f f', s :<: f') =>
Cxt h f a i -> Maybe (s (Cxt h f a) i)
project' -> Just (TupleBinder Cxt h (Sum fs :&: p) a [IdentL]
ns)) = Cxt h (Sum fs :&: p) a [IdentL]
-> Maybe (Cxt h (Sum fs :&: p) a [IdentL])
forall a. a -> Maybe a
Just Cxt h (Sum fs :&: p) a [IdentL]
ns
projF' Cxt h (Sum fs :&: p) a VarDeclBinderL
_ = Maybe (Cxt h (Sum fs :&: p) a [IdentL])
forall a. Maybe a
Nothing
createSortInclusionType ''IdentL ''VarDeclBinderL
deriveAllButSortInjection [''IdentIsVarDeclBinder]
createSortInclusionInfer ''IdentL ''VarDeclBinderL
data SingleLocalVarDeclL
data SingleLocalVarDecl e l where
SingleLocalVarDecl :: e LocalVarDeclAttrsL -> e VarDeclBinderL -> e OptLocalVarInitL -> SingleLocalVarDecl e SingleLocalVarDeclL
deriveAll [''SingleLocalVarDecl]
data EmptyMultiLocalVarDeclCommonAttrs :: Node where
EmptyMultiLocalVarDeclCommonAttrs :: EmptyMultiLocalVarDeclCommonAttrs e MultiLocalVarDeclCommonAttrsL
deriveAll [''EmptyMultiLocalVarDeclCommonAttrs]
data MultiLocalVarDeclL
data MultiLocalVarDecl e l where
MultiLocalVarDecl :: e MultiLocalVarDeclCommonAttrsL -> e [SingleLocalVarDeclL] -> MultiLocalVarDecl e MultiLocalVarDeclL
deriveAll [''MultiLocalVarDecl]
data AssignOpL
data AssignOpEquals :: Node where
AssignOpEquals :: AssignOpEquals e AssignOpL
data AssignOpAdd :: Node where
AssignOpAdd :: AssignOpAdd e AssignOpL
data AssignOpSub :: Node where
AssignOpSub :: AssignOpSub e AssignOpL
data AssignOpMul :: Node where
AssignOpMul :: AssignOpMul e AssignOpL
data AssignOpDiv :: Node where
AssignOpDiv :: AssignOpDiv e AssignOpL
data AssignOpMod :: Node where
AssignOpMod :: AssignOpMod e AssignOpL
data AssignOpBitAnd :: Node where
AssignOpBitAnd :: AssignOpBitAnd e AssignOpL
data AssignOpBitOr :: Node where
AssignOpBitOr :: AssignOpBitOr e AssignOpL
data AssignOpBitXor :: Node where
AssignOpBitXor :: AssignOpBitXor e AssignOpL
data AssignOpArithShr :: Node where
AssignOpArithShr :: AssignOpArithShr e AssignOpL
data AssignOpLogicShr :: Node where
AssignOpLogicShr :: AssignOpLogicShr e AssignOpL
data AssignOpShl :: Node where
AssignOpShl :: AssignOpShl e AssignOpL