module Copilot.Core.Type
( Type (..)
, Typed (..)
, UType (..)
, SimpleType(..)
) where
import Data.Int
import Data.Word
import Copilot.Core.Type.Equality
data Type :: * -> * where
Bool :: Type Bool
Int8 :: Type Int8
Int16 :: Type Int16
Int32 :: Type Int32
Int64 :: Type Int64
Word8 :: Type Word8
Word16 :: Type Word16
Word32 :: Type Word32
Word64 :: Type Word64
Float :: Type Float
Double :: Type Double
instance EqualType Type where
(=~=) Bool Bool = Just Refl
(=~=) Int8 Int8 = Just Refl
(=~=) Int16 Int16 = Just Refl
(=~=) Int32 Int32 = Just Refl
(=~=) Int64 Int64 = Just Refl
(=~=) Word8 Word8 = Just Refl
(=~=) Word16 Word16 = Just Refl
(=~=) Word32 Word32 = Just Refl
(=~=) Word64 Word64 = Just Refl
(=~=) Float Float = Just Refl
(=~=) Double Double = Just Refl
(=~=) _ _ = Nothing
data SimpleType = SBool
| SInt8
| SInt16
| SInt32
| SInt64
| SWord8
| SWord16
| SWord32
| SWord64
| SFloat
| SDouble
deriving Eq
class Typed a where
typeOf :: Type a
simpleType :: Type a -> SimpleType
instance Typed Bool where
typeOf = Bool
simpleType _ = SBool
instance Typed Int8 where
typeOf = Int8
simpleType _ = SBool
instance Typed Int16 where
typeOf = Int16
simpleType _ = SInt16
instance Typed Int32 where
typeOf = Int32
simpleType _ = SInt32
instance Typed Int64 where
typeOf = Int64
simpleType _ = SInt64
instance Typed Word8 where
typeOf = Word8
simpleType _ = SWord8
instance Typed Word16 where
typeOf = Word16
simpleType _ = SWord16
instance Typed Word32 where
typeOf = Word32
simpleType _ = SWord32
instance Typed Word64 where
typeOf = Word64
simpleType _ = SWord64
instance Typed Float where
typeOf = Float
simpleType _ = SFloat
instance Typed Double where
typeOf = Double
simpleType _ = SDouble
data UType = forall a . UType { uTypeType :: Type a }