module DDC.Type.Exp.NFData where
import DDC.Type.Exp.Base
import Control.DeepSeq


instance NFData n => NFData (Binder n) where
 rnf bb
  = case bb of
        RNone   -> ()
        RAnon   -> ()
        RName n -> rnf n


instance NFData n => NFData (Bind n) where
 rnf bb
  = case bb of
        BNone t         -> rnf t
        BAnon t         -> rnf t
        BName n t       -> rnf n `seq` rnf t


instance NFData n => NFData (Bound n) where
 rnf uu
  = case uu of
        UIx   i         -> rnf i
        UName n         -> rnf n
        UPrim u t       -> rnf u `seq` rnf t


instance NFData n => NFData (Type n) where
 rnf tt
  = case tt of
        TVar u          -> rnf u
        TCon tc         -> rnf tc
        TForall b t     -> rnf b  `seq` rnf t
        TApp    t1 t2   -> rnf t1 `seq` rnf t2
        TSum    ts      -> rnf ts


instance NFData n => NFData (TypeSum n) where
 rnf !ts
  = case ts of
        TypeSumBot{}
         -> rnf (typeSumKind ts)

        TypeSumSet{}    
         ->    rnf (typeSumKind       ts)
         `seq` rnf (typeSumElems      ts)
         `seq` rnf (typeSumBoundNamed ts)
         `seq` rnf (typeSumBoundAnon  ts)
         `seq` rnf (typeSumSpill      ts)


instance NFData TyConHash where
 rnf (TyConHash i)
  = rnf i


instance NFData n => NFData (TypeSumVarCon n) where
 rnf ts
  = case ts of
        TypeSumVar u            -> rnf u
        TypeSumCon u k          -> rnf u `seq` rnf k
        

instance NFData n => NFData (TyCon n) where
 rnf tc
  = case tc of
        TyConSort    con        -> rnf con
        TyConKind    con        -> rnf con
        TyConWitness con        -> rnf con
        TyConSpec    con        -> rnf con
        TyConBound   con k      -> rnf con `seq` rnf k
        TyConExists  n   k      -> rnf n   `seq` rnf k


instance NFData SoCon
instance NFData KiCon
instance NFData TwCon
instance NFData TcCon