module Language.Fay.Types
(JsStmt(..)
,JsExp(..)
,JsLit(..)
,JsParam
,JsName
,CompileError(..)
,Compile
,CompilesTo(..)
,Printable(..)
,Fay)
where
import Control.Exception
import Control.Monad.Error (Error,ErrorT)
import Control.Monad.Identity (Identity)
import Data.Data
import Language.Haskell.Exts
type Compile = ErrorT CompileError IO
type JsParam = JsName
type JsName = QName
class (Parseable from,Printable to) => CompilesTo from to | from -> to where
compileTo :: from -> Compile to
class Printable a where
printJS :: a -> String
data CompileError
= ParseError SrcLoc String
| UnsupportedDeclaration Decl
| UnsupportedMatchSyntax Match
| UnsupportedExpression Exp
| UnsupportedLiteral Literal
| UnsupportedLetBinding Decl
| UnsupportedOperator QOp
| UnsupportedPattern Pat
| UnsupportedRhs Rhs
| UnsupportedGuardedAlts GuardedAlts
| EmptyDoBlock
| UnsupportedModuleSyntax Module
| LetUnsupported
| InvalidDoBlock
| RecursiveDoUnsupported
| FfiNeedsTypeSig Decl
deriving (Show,Eq,Data,Typeable)
instance Error CompileError
instance Exception CompileError
newtype Fay a = Fay (Identity a)
deriving Monad
data JsStmt
= JsVar JsName JsExp
| JsIf JsExp [JsStmt] [JsStmt]
| JsEarlyReturn JsExp
| JsThrow JsExp
deriving (Show,Eq)
data JsExp
= JsName JsName
| JsRawName String
| JsFun [JsParam] [JsStmt] (Maybe JsExp)
| JsLit JsLit
| JsApp JsExp [JsExp]
| JsTernaryIf JsExp JsExp JsExp
| JsNull
| JsSequence [JsExp]
| JsParen JsExp
| JsGetProp JsExp JsName
| JsList [JsExp]
| JsNew JsName [JsExp]
| JsThrowExp JsExp
| JsInstanceOf JsExp JsName
| JsIndex Int JsExp
| JsEq JsExp JsExp
| JsInfix String JsExp JsExp
deriving (Show,Eq)
data JsLit
= JsChar Char
| JsStr String
| JsInt Int
| JsFloating Double
| JsBool Bool
deriving (Show,Eq)