module Language.PureScript.Values where
import Language.PureScript.Types
import Language.PureScript.Names
import Data.Data
type Guard = Value
data UnaryOperator
= Negate
| Not
| BitwiseNot deriving (Show, Eq, Data, Typeable)
data BinaryOperator
= Add
| Subtract
| Multiply
| Divide
| Modulus
| EqualTo
| NotEqualTo
| LessThan
| LessThanOrEqualTo
| GreaterThan
| GreaterThanOrEqualTo
| And
| Or
| BitwiseAnd
| BitwiseOr
| BitwiseXor
| ShiftLeft
| ShiftRight
| ZeroFillShiftRight
| Concat deriving (Show, Eq, Data, Typeable)
data Value
= NumericLiteral (Either Integer Double)
| StringLiteral String
| BooleanLiteral Bool
| Unary UnaryOperator Value
| Binary BinaryOperator Value Value
| BinaryNoParens (Qualified Ident) Value Value
| Parens Value
| ArrayLiteral [Value]
| Indexer Value Value
| ObjectLiteral [(String, Value)]
| Accessor String Value
| ObjectUpdate Value [(String, Value)]
| Abs [Ident] Value
| App Value [Value]
| Var (Qualified Ident)
| IfThenElse Value Value Value
| Block [Statement]
| Constructor (Qualified ProperName)
| Case [Value] [([Binder], Maybe Guard, Value)]
| TypedValue Value Type deriving (Show, Data, Typeable)
data Statement
= VariableIntroduction Ident Value
| Assignment Ident Value
| While Value [Statement]
| For Ident Value Value [Statement]
| ForEach Ident Value [Statement]
| If IfStatement
| ValueStatement Value
| Return Value deriving (Show, Data, Typeable)
data IfStatement = IfStatement Value [Statement] (Maybe ElseStatement) deriving (Show, Data, Typeable)
data ElseStatement
= Else [Statement]
| ElseIf IfStatement deriving (Show, Data, Typeable)
data Binder
= NullBinder
| BooleanBinder Bool
| StringBinder String
| NumberBinder (Either Integer Double)
| VarBinder Ident
| NullaryBinder (Qualified ProperName)
| UnaryBinder (Qualified ProperName) Binder
| ObjectBinder [(String, Binder)]
| ArrayBinder [Binder]
| ConsBinder Binder Binder
| NamedBinder Ident Binder deriving (Show, Data, Typeable)