ddc-source-tetra-0.4.3.1: DDC/Source/Tetra/Prim/OpArith.hs
{-# LANGUAGE TypeFamilies #-}
-- | Types of primitive Source Tetra arithmetic operators.
module DDC.Source.Tetra.Prim.OpArith
(typePrimArith)
where
import DDC.Source.Tetra.Prim.TyCon
import DDC.Source.Tetra.Prim.TyConPrim
import DDC.Source.Tetra.Prim.Base
import DDC.Source.Tetra.Exp.Generic
import DDC.Source.Tetra.Exp.Compounds
-- | Take the type of a primitive arithmetic operator.
typePrimArith
:: (Anon l, GTPrim l ~ PrimType)
=> l -> PrimArith -> GType l
typePrimArith l op
= case op of
-- Numeric
PrimArithNeg -> makeTForall l KData $ \t -> t ~> t
PrimArithAdd -> makeTForall l KData $ \t -> t ~> t ~> t
PrimArithSub -> makeTForall l KData $ \t -> t ~> t ~> t
PrimArithMul -> makeTForall l KData $ \t -> t ~> t ~> t
PrimArithDiv -> makeTForall l KData $ \t -> t ~> t ~> t
PrimArithMod -> makeTForall l KData $ \t -> t ~> t ~> t
PrimArithRem -> makeTForall l KData $ \t -> t ~> t ~> t
-- Comparison
PrimArithEq -> makeTForall l KData $ \t -> t ~> t ~> TBool
PrimArithNeq -> makeTForall l KData $ \t -> t ~> t ~> TBool
PrimArithGt -> makeTForall l KData $ \t -> t ~> t ~> TBool
PrimArithLt -> makeTForall l KData $ \t -> t ~> t ~> TBool
PrimArithLe -> makeTForall l KData $ \t -> t ~> t ~> TBool
PrimArithGe -> makeTForall l KData $ \t -> t ~> t ~> TBool
-- Boolean
PrimArithAnd -> TBool ~> TBool ~> TBool
PrimArithOr -> TBool ~> TBool ~> TBool
-- Bitwise
PrimArithShl -> makeTForall l KData $ \t -> t ~> t ~> t
PrimArithShr -> makeTForall l KData $ \t -> t ~> t ~> t
PrimArithBAnd -> makeTForall l KData $ \t -> t ~> t ~> t
PrimArithBOr -> makeTForall l KData $ \t -> t ~> t ~> t
PrimArithBXOr -> makeTForall l KData $ \t -> t ~> t ~> t