ddc-core-llvm-0.3.2.1: DDC/Core/Llvm/Convert/Erase.hs
module DDC.Core.Llvm.Convert.Erase
( eraseTypeWitArgs
, eraseXLAMs
, eraseWitTApps
, eraseWitBinds )
where
import DDC.Type.Predicates
import DDC.Core.Exp
import DDC.Core.Transform.TransformUpX
-- | Erase type and witness arge Slurp out only the values from a list of
-- function arguments.
eraseTypeWitArgs :: [Exp a n] -> [Exp a n]
eraseTypeWitArgs [] = []
eraseTypeWitArgs (x:xs)
= case x of
XType{} -> eraseTypeWitArgs xs
XWitness{} -> eraseTypeWitArgs xs
_ -> x : eraseTypeWitArgs xs
-- | Erase all `XLAM` binders from an expression.
eraseXLAMs :: Ord n => Exp a n -> Exp a n
eraseXLAMs
= transformUpX'
$ \x -> case x of
XLAM _ _ x' -> x'
_ -> x
eraseWitTApps :: Type n -> Type n
eraseWitTApps tt
= case tt of
TApp (TApp (TCon (TyConWitness _)) _) t -> eraseWitTApps t
_ -> tt
-- | Erase witness bindings
eraseWitBinds :: Eq n => [(Bool, Bind n)] -> [(Bool, Bind n)]
eraseWitBinds
= let isBindWit (_, b)
= case b of
BName _ t | isWitnessType t -> True
_ -> False
in filter (not . isBindWit)