packages feed

ddc-source-tetra-0.4.3.1: DDC/Source/Tetra/Exp/NFData.hs

{-# LANGUAGE UndecidableInstances #-}
module DDC.Source.Tetra.Exp.NFData where
import DDC.Source.Tetra.Exp.Generic
import qualified DDC.Type.Exp.Generic.NFData    as T
import Control.DeepSeq

---------------------------------------------------------------------------------------------------
type NFDataLanguage l
        = ( NFData l, T.NFDataLanguage l
          , NFData (GXAnnot   l)
          , NFData (GXBindVar l),  NFData (GXBoundVar l)
          , NFData (GXBindCon l),  NFData (GXBoundCon l)
          , NFData (GXPrim    l))

instance NFDataLanguage l => NFData (GExp l) where
 rnf xx
  = case xx of
        XAnnot    a x           -> rnf a `seq` rnf x
        XVar      u             -> rnf u
        XPrim     p             -> rnf p
        XCon      dc            -> rnf dc
        XLAM      b x           -> rnf b   `seq` rnf x
        XLam      b x           -> rnf b   `seq` rnf x
        XApp      x1 x2         -> rnf x1  `seq` rnf x2
        XLet      lts x         -> rnf lts `seq` rnf x
        XCase     x alts        -> rnf x   `seq` rnf alts
        XCast     c x           -> rnf c   `seq` rnf x
        XType     t             -> rnf t
        XWitness  w             -> rnf w
        XDefix    a xs          -> rnf a   `seq` rnf xs
        XInfixOp  a s           -> rnf a   `seq` rnf s
        XInfixVar a s           -> rnf a   `seq` rnf s
        XMatch    a as x        -> rnf a   `seq` rnf as `seq` rnf x
        XWhere    a cl x        -> rnf a   `seq` rnf cl `seq` rnf x
        XLamPat   a w mt x      -> rnf a   `seq` rnf w  `seq` rnf mt `seq` rnf x
        XLamCase  a as          -> rnf a   `seq` rnf as


instance NFDataLanguage l => NFData (GXBindVarMT l) where
 rnf (XBindVarMT b mt)
  = rnf b `seq` rnf mt


instance NFDataLanguage l => NFData (GClause l) where
 rnf cc
  = case cc of
        SSig a b t              -> rnf a `seq` rnf b `seq` rnf t
        SLet a b ps gxs         -> rnf a `seq` rnf b `seq` rnf ps `seq` rnf gxs


instance NFDataLanguage l => NFData (GParam l) where
 rnf pp
  = case pp of
        MType    b mt           -> rnf b `seq` rnf mt
        MWitness b mt           -> rnf b `seq` rnf mt
        MValue   p mt           -> rnf p `seq` rnf mt


instance NFDataLanguage l => NFData (GLets l) where
 rnf lts
  = case lts of
        LLet b x                -> rnf b `seq` rnf x
        LRec bxs                -> rnf bxs
        LPrivate bs1 mR bs2     -> rnf bs1  `seq` rnf mR `seq` rnf bs2
        LGroup cs               -> rnf cs


instance NFDataLanguage l => NFData (GAltCase l) where
 rnf aa
  = case aa of
        AAltCase w gxs          -> rnf w `seq` rnf gxs


instance NFDataLanguage l => NFData (GAltMatch l) where
 rnf aa
  = case aa of
        AAltMatch gs            -> rnf gs


instance NFDataLanguage l => NFData (GPat l) where
 rnf pp
  = case pp of
        PDefault                -> ()
        PAt   b p               -> rnf b  `seq` rnf p
        PVar  b                 -> rnf b
        PData dc bs             -> rnf dc `seq` rnf bs


instance NFDataLanguage l => NFData (GGuardedExp l) where
 rnf gx
  = case gx of
        GGuard g gx'            -> rnf g `seq` rnf gx'
        GExp x                  -> rnf x


instance NFDataLanguage l => NFData (GGuard l) where
 rnf gg
  = case gg of
        GPred x                 -> rnf x
        GPat  p x               -> rnf p `seq` rnf x
        GDefault                -> ()


instance NFDataLanguage l => NFData (GCast l) where
 rnf cc
  = case cc of
        CastWeakenEffect e      -> rnf e
        CastPurify w            -> rnf w
        CastBox                 -> ()
        CastRun                 -> ()


instance NFDataLanguage l => NFData (GWitness l) where
 rnf ww
  = case ww of
        WAnnot a w              -> rnf a `seq` rnf w
        WVar   u                -> rnf u
        WCon   c                -> rnf c
        WApp   w1 w2            -> rnf w1 `seq` rnf w2
        WType  t                -> rnf t


instance NFDataLanguage l => NFData (GWiCon l) where
 rnf wc
  = case wc of
        WiConBound u t          -> rnf u `seq` rnf t