packages feed

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