module DDC.Core.Exp.Annot.Exp
( module DDC.Type.Exp
, Exp (..)
, Lets (..)
, Alt (..)
, Pat (..)
, Cast (..)
, Witness (..)
, DaCon (..)
, WiCon (..))
where
import DDC.Core.Exp.WiCon
import DDC.Core.Exp.DaCon
import DDC.Type.Exp
import DDC.Type.Sum ()
import Control.DeepSeq
data Exp a n
= XVar !a !(Bound n)
| XCon !a !(DaCon n)
| XLAM !a !(Bind n) !(Exp a n)
| XLam !a !(Bind n) !(Exp a n)
| XApp !a !(Exp a n) !(Exp a n)
| XLet !a !(Lets a n) !(Exp a n)
| XCase !a !(Exp a n) ![Alt a n]
| XCast !a !(Cast a n) !(Exp a n)
| XType !a !(Type n)
| XWitness !a !(Witness a n)
deriving (Show, Eq)
data Lets a n
= LLet !(Bind n) !(Exp a n)
| LRec ![(Bind n, Exp a n)]
| LPrivate ![Bind n] !(Maybe (Type n)) ![Bind n]
deriving (Show, Eq)
data Alt a n
= AAlt !(Pat n) !(Exp a n)
deriving (Show, Eq)
data Pat n
= PDefault
| PData !(DaCon n) ![Bind n]
deriving (Show, Eq)
data Cast a n
= CastWeakenEffect !(Effect n)
| CastPurify !(Witness a n)
| CastBox
| CastRun
deriving (Show, Eq)
data Witness a n
= WVar a !(Bound n)
| WCon a !(WiCon n)
| WApp a !(Witness a n) !(Witness a n)
| WType a !(Type n)
deriving (Show, Eq)
instance (NFData a, NFData n) => NFData (Exp a n) where
rnf xx
= case xx of
XVar a u -> rnf a `seq` rnf u
XCon a dc -> rnf a `seq` rnf dc
XLAM a b x -> rnf a `seq` rnf b `seq` rnf x
XLam a b x -> rnf a `seq` rnf b `seq` rnf x
XApp a x1 x2 -> rnf a `seq` rnf x1 `seq` rnf x2
XLet a lts x -> rnf a `seq` rnf lts `seq` rnf x
XCase a x alts -> rnf a `seq` rnf x `seq` rnf alts
XCast a c x -> rnf a `seq` rnf c `seq` rnf x
XType a t -> rnf a `seq` rnf t
XWitness a w -> rnf a `seq` rnf w
instance (NFData a, NFData n) => NFData (Cast a n) where
rnf cc
= case cc of
CastWeakenEffect e -> rnf e
CastPurify w -> rnf w
CastBox -> ()
CastRun -> ()
instance (NFData a, NFData n) => NFData (Lets a n) where
rnf lts
= case lts of
LLet b x -> rnf b `seq` rnf x
LRec bxs -> rnf bxs
LPrivate bs1 u2 bs3 -> rnf bs1 `seq` rnf u2 `seq` rnf bs3
instance (NFData a, NFData n) => NFData (Alt a n) where
rnf aa
= case aa of
AAlt w x -> rnf w `seq` rnf x
instance NFData n => NFData (Pat n) where
rnf pp
= case pp of
PDefault -> ()
PData dc bs -> rnf dc `seq` rnf bs
instance (NFData a, NFData n) => NFData (Witness a n) where
rnf ww
= case ww of
WVar a u -> rnf a `seq` rnf u
WCon a c -> rnf a `seq` rnf c
WApp a w1 w2 -> rnf a `seq` rnf w1 `seq` rnf w2
WType a tt -> rnf a `seq` rnf tt