content: {-# LANGUAGE DeriveFunctor #-}
  {-# LANGUAGE TemplateHaskell #-}
  
  module Ivory.Language.Syntax.Type where
  
  import Language.Haskell.TH.Lift (deriveLiftMany)
  
  
  -- Types -----------------------------------------------------------------------
  
  data Type
    = TyVoid             -- ^ Unit type
    | TyInt IntSize      -- ^ Signed ints
    | TyWord WordSize    -- ^ Unsigned ints
    | TyIndex Integer    -- ^ Indices with an upper bound
    | TyBool             -- ^ Booleans
    | TyChar             -- ^ Characters
    | TyFloat            -- ^ Floats
    | TyDouble           -- ^ Doubles
    | TyProc Type [Type] -- ^ Procedures
    | TyRef Type         -- ^ References
    | TyConstRef Type    -- ^ Constant References
    | TyPtr Type         -- ^ Pointers
    | TyConstPtr Type    -- ^ Constant Pointers
    | TyArr Int Type     -- ^ Arrays
    | TyStruct String    -- ^ Structures
    | TyCArray Type      -- ^ C Arrays
    | TyOpaque           -- ^ Opaque type---not implementable.
      deriving (Show, Eq, Ord)
  
  data IntSize
    = Int8
    | Int16
    | Int32
    | Int64
    deriving (Show,Eq,Ord)
  
  
  data WordSize
    = Word8
    | Word16
    | Word32
    | Word64
    deriving (Show,Eq,Ord)
  
  
  data Typed a = Typed
    { tType  :: Type
    , tValue :: a
    } deriving (Show,Functor,Eq,Ord)
  
  
  -- TH Lifting ------------------------------------------------------------------
  
  deriveLiftMany [ ''Type, ''IntSize, ''WordSize, ''Typed ]
  