{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE Safe #-}
module Copilot.Core.Expr
( Id
, Name
, Expr (..)
, UExpr (..)
, DropIdx
)
where
import Data.Typeable (Typeable)
import Data.Word (Word32)
import Copilot.Core.Operators (Op1, Op2, Op3)
import Copilot.Core.Type (Type)
type Id = Int
type Name = String
type DropIdx = Word32
data Expr a where
Const :: Typeable a
=> Type a -> a -> Expr a
Drop :: Typeable a
=> Type a -> DropIdx -> Id -> Expr a
Local :: Typeable a
=> Type a -> Type b -> Name -> Expr a -> Expr b -> Expr b
Var :: Typeable a
=> Type a -> Name -> Expr a
ExternVar :: Typeable a
=> Type a -> Name -> Maybe [a] -> Expr a
Op1 :: Typeable a
=> Op1 a b -> Expr a -> Expr b
Op2 :: (Typeable a, Typeable b)
=> Op2 a b c -> Expr a -> Expr b -> Expr c
Op3 :: (Typeable a, Typeable b, Typeable c)
=> Op3 a b c d -> Expr a -> Expr b -> Expr c -> Expr d
Label :: Typeable a
=> Type a -> String -> Expr a -> Expr a
data UExpr = forall a . Typeable a => UExpr
{ ()
uExprType :: Type a
, ()
uExprExpr :: Expr a
}
{-# DEPRECATED uExprType, uExprExpr "These fields are deprecated in Copilot 4.2. Use pattern matching instead." #-}