module DDC.Core.Tetra.Prim.OpArith
( readPrimArith
, typePrimArith)
where
import DDC.Core.Tetra.Prim.Base
import DDC.Type.Compounds
import DDC.Type.Exp
import DDC.Core.Salt.Name (readPrimArith)
typePrimArith :: PrimArith -> Type Name
typePrimArith op
= case op of
PrimArithNeg -> tForall kData $ \t -> t `tFun` t
PrimArithAdd -> tForall kData $ \t -> t `tFun` t `tFun` t
PrimArithSub -> tForall kData $ \t -> t `tFun` t `tFun` t
PrimArithMul -> tForall kData $ \t -> t `tFun` t `tFun` t
PrimArithDiv -> tForall kData $ \t -> t `tFun` t `tFun` t
PrimArithMod -> tForall kData $ \t -> t `tFun` t `tFun` t
PrimArithRem -> tForall kData $ \t -> t `tFun` t `tFun` t
PrimArithShl -> tForall kData $ \t -> t `tFun` t `tFun` t
PrimArithShr -> tForall kData $ \t -> t `tFun` t `tFun` t
PrimArithBAnd -> tForall kData $ \t -> t `tFun` t `tFun` t
PrimArithBOr -> tForall kData $ \t -> t `tFun` t `tFun` t
PrimArithBXOr -> tForall kData $ \t -> t `tFun` t `tFun` t
PrimArithAnd -> tForall kData $ \tb
-> tb `tFun` tb `tFun` tb
PrimArithOr -> tForall kData $ \tb
-> tb `tFun` tb `tFun` tb
PrimArithEq -> tForalls [kData, kData] $ \[t, tb]
-> t `tFun` t `tFun` tb
PrimArithNeq -> tForalls [kData, kData] $ \[t, tb]
-> t `tFun` t `tFun` tb
PrimArithGt -> tForalls [kData, kData] $ \[t, tb]
-> t `tFun` t `tFun` tb
PrimArithLt -> tForalls [kData, kData] $ \[t, tb]
-> t `tFun` t `tFun` tb
PrimArithLe -> tForalls [kData, kData] $ \[t, tb]
-> t `tFun` t `tFun` tb
PrimArithGe -> tForalls [kData, kData] $ \[t, tb]
-> t `tFun` t `tFun` tb