{-# LANGUAGE NoMonomorphismRestriction #-}
-- | Utility combinator functions for simplifying writing programmatic
-- generation of ECMAScript code. Recommended to use together with the
-- -XOverloadedStrings GHC extension.
module Language.ECMAScript3.Syntax.CodeGen where

import Language.ECMAScript3.Syntax
import Data.Default.Class
import Data.String

script :: Default a => [Statement a] -> JavaScript a
script :: [Statement a] -> JavaScript a
script = a -> [Statement a] -> JavaScript a
forall a. a -> [Statement a] -> JavaScript a
Script a
forall a. Default a => a
def

instance Default a => IsString (Id a) where
  fromString :: String -> Id a
fromString = a -> String -> Id a
forall a. a -> String -> Id a
Id a
forall a. Default a => a
def

instance Default a => IsString (Prop a) where
  fromString :: String -> Prop a
fromString = a -> String -> Prop a
forall a. a -> String -> Prop a
PropString a
forall a. Default a => a
def

ident :: Default a => String -> Id a
ident :: String -> Id a
ident = a -> String -> Id a
forall a. a -> String -> Id a
Id a
forall a. Default a => a
def

propId :: Default a => Id a -> Prop a
propId :: Id a -> Prop a
propId = a -> Id a -> Prop a
forall a. a -> Id a -> Prop a
PropId a
forall a. Default a => a
def

propS :: Default a => String -> Prop a
propS :: String -> Prop a
propS = a -> String -> Prop a
forall a. a -> String -> Prop a
PropString a
forall a. Default a => a
def

propN :: Default a => Integer -> Prop a
propN :: Integer -> Prop a
propN = a -> Integer -> Prop a
forall a. a -> Integer -> Prop a
PropNum a
forall a. Default a => a
def

instance Default a => IsString (LValue a) where
  fromString :: String -> LValue a
fromString = a -> String -> LValue a
forall a. a -> String -> LValue a
LVar a
forall a. Default a => a
def

lvar :: Default a => String -> LValue a
lvar :: String -> LValue a
lvar = a -> String -> LValue a
forall a. a -> String -> LValue a
LVar a
forall a. Default a => a
def

ldot :: Default a => Expression a -> String -> LValue a
ldot :: Expression a -> String -> LValue a
ldot = a -> Expression a -> String -> LValue a
forall a. a -> Expression a -> String -> LValue a
LDot a
forall a. Default a => a
def

lbrack :: Default a => Expression a -> Expression a -> LValue a
lbrack :: Expression a -> Expression a -> LValue a
lbrack = a -> Expression a -> Expression a -> LValue a
forall a. a -> Expression a -> Expression a -> LValue a
LBracket a
forall a. Default a => a
def

instance Default a => IsString (Expression a) where
  fromString :: String -> Expression a
fromString = a -> String -> Expression a
forall a. a -> String -> Expression a
StringLit a
forall a. Default a => a
def

string :: Default a => String -> Expression a
string :: String -> Expression a
string = a -> String -> Expression a
forall a. a -> String -> Expression a
StringLit a
forall a. Default a => a
def

regexp :: Default a => String -> Bool -> Bool -> Expression a
regexp :: String -> Bool -> Bool -> Expression a
regexp = a -> String -> Bool -> Bool -> Expression a
forall a. a -> String -> Bool -> Bool -> Expression a
RegexpLit a
forall a. Default a => a
def

number :: Default a => Double -> Expression a
number :: Double -> Expression a
number = a -> Double -> Expression a
forall a. a -> Double -> Expression a
NumLit a
forall a. Default a => a
def

bool :: Default a => Bool -> Expression a
bool :: Bool -> Expression a
bool = a -> Bool -> Expression a
forall a. a -> Bool -> Expression a
BoolLit a
forall a. Default a => a
def

int :: Default a => Int -> Expression a
int :: Int -> Expression a
int    = a -> Int -> Expression a
forall a. a -> Int -> Expression a
IntLit a
forall a. Default a => a
def

null_ :: Default a => Expression a
null_ :: Expression a
null_   = a -> Expression a
forall a. a -> Expression a
NullLit a
forall a. Default a => a
def

array :: Default a => [Expression a] -> Expression a
array :: [Expression a] -> Expression a
array = a -> [Expression a] -> Expression a
forall a. a -> [Expression a] -> Expression a
ArrayLit a
forall a. Default a => a
def

object :: Default a => [(Prop a, Expression a)] -> Expression a
object :: [(Prop a, Expression a)] -> Expression a
object = a -> [(Prop a, Expression a)] -> Expression a
forall a. a -> [(Prop a, Expression a)] -> Expression a
ObjectLit a
forall a. Default a => a
def

this :: Default a => Expression a
this :: Expression a
this = a -> Expression a
forall a. a -> Expression a
ThisRef a
forall a. Default a => a
def

var :: Default a => Id a -> Expression a
var :: Id a -> Expression a
var = a -> Id a -> Expression a
forall a. a -> Id a -> Expression a
VarRef a
forall a. Default a => a
def

dot :: Default a => Expression a -> Id a -> Expression a
dot :: Expression a -> Id a -> Expression a
dot = a -> Expression a -> Id a -> Expression a
forall a. a -> Expression a -> Id a -> Expression a
DotRef a
forall a. Default a => a
def

brack :: Default a => Expression a -> Expression a -> Expression a
brack :: Expression a -> Expression a -> Expression a
brack = a -> Expression a -> Expression a -> Expression a
forall a. a -> Expression a -> Expression a -> Expression a
BracketRef a
forall a. Default a => a
def

new :: Default a => Expression a -> [Expression a] -> Expression a
new :: Expression a -> [Expression a] -> Expression a
new = a -> Expression a -> [Expression a] -> Expression a
forall a. a -> Expression a -> [Expression a] -> Expression a
NewExpr a
forall a. Default a => a
def

prefix :: Default a => PrefixOp -> Expression a -> Expression a
prefix :: PrefixOp -> Expression a -> Expression a
prefix = a -> PrefixOp -> Expression a -> Expression a
forall a. a -> PrefixOp -> Expression a -> Expression a
PrefixExpr a
forall a. Default a => a
def

lnot :: Default a => Expression a -> Expression a
lnot :: Expression a -> Expression a
lnot = PrefixOp -> Expression a -> Expression a
forall a. Default a => PrefixOp -> Expression a -> Expression a
prefix PrefixOp
PrefixLNot

bnot :: Default a => Expression a -> Expression a
bnot :: Expression a -> Expression a
bnot = PrefixOp -> Expression a -> Expression a
forall a. Default a => PrefixOp -> Expression a -> Expression a
prefix PrefixOp
PrefixBNot

plus :: Default a => Expression a -> Expression a
plus :: Expression a -> Expression a
plus = PrefixOp -> Expression a -> Expression a
forall a. Default a => PrefixOp -> Expression a -> Expression a
prefix PrefixOp
PrefixPlus

minus :: Default a => Expression a -> Expression a
minus :: Expression a -> Expression a
minus = PrefixOp -> Expression a -> Expression a
forall a. Default a => PrefixOp -> Expression a -> Expression a
prefix PrefixOp
PrefixMinus

typeof :: Default a => Expression a -> Expression a
typeof :: Expression a -> Expression a
typeof = PrefixOp -> Expression a -> Expression a
forall a. Default a => PrefixOp -> Expression a -> Expression a
prefix PrefixOp
PrefixTypeof

void :: Default a => Expression a -> Expression a
void :: Expression a -> Expression a
void = PrefixOp -> Expression a -> Expression a
forall a. Default a => PrefixOp -> Expression a -> Expression a
prefix PrefixOp
PrefixVoid

delete :: Default a => Expression a -> Expression a
delete :: Expression a -> Expression a
delete = PrefixOp -> Expression a -> Expression a
forall a. Default a => PrefixOp -> Expression a -> Expression a
prefix PrefixOp
PrefixDelete

uassign :: Default a => UnaryAssignOp -> LValue a -> Expression a
uassign :: UnaryAssignOp -> LValue a -> Expression a
uassign = a -> UnaryAssignOp -> LValue a -> Expression a
forall a. a -> UnaryAssignOp -> LValue a -> Expression a
UnaryAssignExpr a
forall a. Default a => a
def

preinc :: Default a => LValue a -> Expression a
preinc :: LValue a -> Expression a
preinc = UnaryAssignOp -> LValue a -> Expression a
forall a. Default a => UnaryAssignOp -> LValue a -> Expression a
uassign UnaryAssignOp
PrefixInc

predec :: Default a => LValue a -> Expression a
predec :: LValue a -> Expression a
predec = UnaryAssignOp -> LValue a -> Expression a
forall a. Default a => UnaryAssignOp -> LValue a -> Expression a
uassign UnaryAssignOp
PrefixDec

postinc :: Default a => LValue a -> Expression a
postinc :: LValue a -> Expression a
postinc = UnaryAssignOp -> LValue a -> Expression a
forall a. Default a => UnaryAssignOp -> LValue a -> Expression a
uassign UnaryAssignOp
PostfixInc

postdec :: Default a => LValue a -> Expression a
postdec :: LValue a -> Expression a
postdec = UnaryAssignOp -> LValue a -> Expression a
forall a. Default a => UnaryAssignOp -> LValue a -> Expression a
uassign UnaryAssignOp
PostfixDec

infixe
  :: Default a =>
     InfixOp -> Expression a -> Expression a -> Expression a
infixe :: InfixOp -> Expression a -> Expression a -> Expression a
infixe = a -> InfixOp -> Expression a -> Expression a -> Expression a
forall a.
a -> InfixOp -> Expression a -> Expression a -> Expression a
InfixExpr a
forall a. Default a => a
def

lt :: Default a => Expression a -> Expression a -> Expression a
lt :: Expression a -> Expression a -> Expression a
lt = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpLT

le :: Default a => Expression a -> Expression a -> Expression a
le :: Expression a -> Expression a -> Expression a
le = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpLEq

gt :: Default a => Expression a -> Expression a -> Expression a
gt :: Expression a -> Expression a -> Expression a
gt = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpGT

ge :: Default a => Expression a -> Expression a -> Expression a
ge :: Expression a -> Expression a -> Expression a
ge = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpGEq

in_ :: Default a => Expression a -> Expression a -> Expression a
in_ :: Expression a -> Expression a -> Expression a
in_= InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpIn

instanceof
  :: Default a => Expression a -> Expression a -> Expression a
instanceof :: Expression a -> Expression a -> Expression a
instanceof = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpInstanceof

eq :: Default a => Expression a -> Expression a -> Expression a
eq :: Expression a -> Expression a -> Expression a
eq = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpEq

neq :: Default a => Expression a -> Expression a -> Expression a
neq :: Expression a -> Expression a -> Expression a
neq = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpNEq

steq :: Default a => Expression a -> Expression a -> Expression a
steq :: Expression a -> Expression a -> Expression a
steq = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpStrictEq

stneq :: Default a => Expression a -> Expression a -> Expression a
stneq :: Expression a -> Expression a -> Expression a
stneq = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpStrictNEq

land :: Default a => Expression a -> Expression a -> Expression a
land :: Expression a -> Expression a -> Expression a
land = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpLAnd

lor :: Default a => Expression a -> Expression a -> Expression a
lor :: Expression a -> Expression a -> Expression a
lor  = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpLOr

mul :: Default a => Expression a -> Expression a -> Expression a
mul :: Expression a -> Expression a -> Expression a
mul = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpMul

div :: Default a => Expression a -> Expression a -> Expression a
div :: Expression a -> Expression a -> Expression a
div = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpDiv

mod :: Default a => Expression a -> Expression a -> Expression a
mod :: Expression a -> Expression a -> Expression a
mod = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpMod

sub :: Default a => Expression a -> Expression a -> Expression a
sub :: Expression a -> Expression a -> Expression a
sub = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpSub

lshift :: Default a => Expression a -> Expression a -> Expression a
lshift :: Expression a -> Expression a -> Expression a
lshift = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpLShift

srshift
  :: Default a => Expression a -> Expression a -> Expression a
srshift :: Expression a -> Expression a -> Expression a
srshift = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpSpRShift

zrshift
  :: Default a => Expression a -> Expression a -> Expression a
zrshift :: Expression a -> Expression a -> Expression a
zrshift = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpZfRShift

band :: Default a => Expression a -> Expression a -> Expression a
band :: Expression a -> Expression a -> Expression a
band = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpBAnd

bor :: Default a => Expression a -> Expression a -> Expression a
bor :: Expression a -> Expression a -> Expression a
bor = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpBOr

xor :: Default a => Expression a -> Expression a -> Expression a
xor :: Expression a -> Expression a -> Expression a
xor = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpBXor

add :: Default a => Expression a -> Expression a -> Expression a
add :: Expression a -> Expression a -> Expression a
add = InfixOp -> Expression a -> Expression a -> Expression a
forall a.
Default a =>
InfixOp -> Expression a -> Expression a -> Expression a
infixe InfixOp
OpAdd

cond
  :: Default a =>
     Expression a -> Expression a -> Expression a -> Expression a
cond :: Expression a -> Expression a -> Expression a -> Expression a
cond = a -> Expression a -> Expression a -> Expression a -> Expression a
forall a.
a -> Expression a -> Expression a -> Expression a -> Expression a
CondExpr a
forall a. Default a => a
def

assignop :: Default a => AssignOp -> LValue a -> Expression a -> Expression a
assignop :: AssignOp -> LValue a -> Expression a -> Expression a
assignop = a -> AssignOp -> LValue a -> Expression a -> Expression a
forall a. a -> AssignOp -> LValue a -> Expression a -> Expression a
AssignExpr a
forall a. Default a => a
def

assign
  :: Default a => LValue a -> Expression a -> Expression a
assign :: LValue a -> Expression a -> Expression a
assign = AssignOp -> LValue a -> Expression a -> Expression a
forall a.
Default a =>
AssignOp -> LValue a -> Expression a -> Expression a
assignop AssignOp
OpAssign

assignadd :: Default a => LValue a -> Expression a -> Expression a
assignadd :: LValue a -> Expression a -> Expression a
assignadd = AssignOp -> LValue a -> Expression a -> Expression a
forall a.
Default a =>
AssignOp -> LValue a -> Expression a -> Expression a
assignop AssignOp
OpAssignAdd

assignsub :: Default a => LValue a -> Expression a -> Expression a
assignsub :: LValue a -> Expression a -> Expression a
assignsub = AssignOp -> LValue a -> Expression a -> Expression a
forall a.
Default a =>
AssignOp -> LValue a -> Expression a -> Expression a
assignop AssignOp
OpAssignSub

assignmul :: Default a => LValue a -> Expression a -> Expression a
assignmul :: LValue a -> Expression a -> Expression a
assignmul = AssignOp -> LValue a -> Expression a -> Expression a
forall a.
Default a =>
AssignOp -> LValue a -> Expression a -> Expression a
assignop AssignOp
OpAssignMul

assigndiv :: Default a => LValue a -> Expression a -> Expression a
assigndiv :: LValue a -> Expression a -> Expression a
assigndiv = AssignOp -> LValue a -> Expression a -> Expression a
forall a.
Default a =>
AssignOp -> LValue a -> Expression a -> Expression a
assignop AssignOp
OpAssignDiv

assignmod :: Default a => LValue a -> Expression a -> Expression a
assignmod :: LValue a -> Expression a -> Expression a
assignmod = AssignOp -> LValue a -> Expression a -> Expression a
forall a.
Default a =>
AssignOp -> LValue a -> Expression a -> Expression a
assignop AssignOp
OpAssignMod

assignlshift
  :: Default a => LValue a -> Expression a -> Expression a
assignlshift :: LValue a -> Expression a -> Expression a
assignlshift = AssignOp -> LValue a -> Expression a -> Expression a
forall a.
Default a =>
AssignOp -> LValue a -> Expression a -> Expression a
assignop AssignOp
OpAssignLShift

assignsrshift
  :: Default a => LValue a -> Expression a -> Expression a
assignsrshift :: LValue a -> Expression a -> Expression a
assignsrshift = AssignOp -> LValue a -> Expression a -> Expression a
forall a.
Default a =>
AssignOp -> LValue a -> Expression a -> Expression a
assignop AssignOp
OpAssignSpRShift

assignzrshift
  :: Default a => LValue a -> Expression a -> Expression a
assignzrshift :: LValue a -> Expression a -> Expression a
assignzrshift = AssignOp -> LValue a -> Expression a -> Expression a
forall a.
Default a =>
AssignOp -> LValue a -> Expression a -> Expression a
assignop AssignOp
OpAssignZfRShift

assignband :: Default a => LValue a -> Expression a -> Expression a
assignband :: LValue a -> Expression a -> Expression a
assignband = AssignOp -> LValue a -> Expression a -> Expression a
forall a.
Default a =>
AssignOp -> LValue a -> Expression a -> Expression a
assignop AssignOp
OpAssignBAnd

assignxor :: Default a => LValue a -> Expression a -> Expression a
assignxor :: LValue a -> Expression a -> Expression a
assignxor = AssignOp -> LValue a -> Expression a -> Expression a
forall a.
Default a =>
AssignOp -> LValue a -> Expression a -> Expression a
assignop AssignOp
OpAssignBXor

assignbor :: Default a => LValue a -> Expression a -> Expression a
assignbor :: LValue a -> Expression a -> Expression a
assignbor = AssignOp -> LValue a -> Expression a -> Expression a
forall a.
Default a =>
AssignOp -> LValue a -> Expression a -> Expression a
assignop AssignOp
OpAssignBOr

list :: Default a => [Expression a] -> Expression a
list :: [Expression a] -> Expression a
list = a -> [Expression a] -> Expression a
forall a. a -> [Expression a] -> Expression a
ListExpr a
forall a. Default a => a
def

call :: Default a => Expression a -> [Expression a] -> Expression a
call :: Expression a -> [Expression a] -> Expression a
call = a -> Expression a -> [Expression a] -> Expression a
forall a. a -> Expression a -> [Expression a] -> Expression a
CallExpr a
forall a. Default a => a
def

func
  :: Default a => Id a -> [Id a] -> [Statement a] -> Expression a
func :: Id a -> [Id a] -> [Statement a] -> Expression a
func Id a
id = a -> Maybe (Id a) -> [Id a] -> [Statement a] -> Expression a
forall a.
a -> Maybe (Id a) -> [Id a] -> [Statement a] -> Expression a
FuncExpr a
forall a. Default a => a
def (Id a -> Maybe (Id a)
forall a. a -> Maybe a
Just Id a
id)

lambda :: Default a => [Id a] -> [Statement a] -> Expression a
lambda :: [Id a] -> [Statement a] -> Expression a
lambda = a -> Maybe (Id a) -> [Id a] -> [Statement a] -> Expression a
forall a.
a -> Maybe (Id a) -> [Id a] -> [Statement a] -> Expression a
FuncExpr a
forall a. Default a => a
def Maybe (Id a)
forall a. Maybe a
Nothing

casee :: Default a => Expression a -> [Statement a] -> CaseClause a
casee :: Expression a -> [Statement a] -> CaseClause a
casee = a -> Expression a -> [Statement a] -> CaseClause a
forall a. a -> Expression a -> [Statement a] -> CaseClause a
CaseClause a
forall a. Default a => a
def

defaultc :: Default a => [Statement a] -> CaseClause a
defaultc :: [Statement a] -> CaseClause a
defaultc = a -> [Statement a] -> CaseClause a
forall a. a -> [Statement a] -> CaseClause a
CaseDefault a
forall a. Default a => a
def

catch :: Default a => Id a -> Statement a -> CatchClause a
catch :: Id a -> Statement a -> CatchClause a
catch = a -> Id a -> Statement a -> CatchClause a
forall a. a -> Id a -> Statement a -> CatchClause a
CatchClause a
forall a. Default a => a
def

vardecl :: Default a => Id a -> VarDecl a
vardecl :: Id a -> VarDecl a
vardecl Id a
id = a -> Id a -> Maybe (Expression a) -> VarDecl a
forall a. a -> Id a -> Maybe (Expression a) -> VarDecl a
VarDecl a
forall a. Default a => a
def Id a
id Maybe (Expression a)
forall a. Maybe a
Nothing

varinit :: Default a => Id a -> Expression a -> VarDecl a
varinit :: Id a -> Expression a -> VarDecl a
varinit Id a
id = a -> Id a -> Maybe (Expression a) -> VarDecl a
forall a. a -> Id a -> Maybe (Expression a) -> VarDecl a
VarDecl a
forall a. Default a => a
def Id a
id (Maybe (Expression a) -> VarDecl a)
-> (Expression a -> Maybe (Expression a))
-> Expression a
-> VarDecl a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expression a -> Maybe (Expression a)
forall a. a -> Maybe a
Just

block :: Default a => [Statement a] -> Statement a
block :: [Statement a] -> Statement a
block = a -> [Statement a] -> Statement a
forall a. a -> [Statement a] -> Statement a
BlockStmt a
forall a. Default a => a
def

empty :: Default a => Statement a
empty :: Statement a
empty = a -> Statement a
forall a. a -> Statement a
EmptyStmt a
forall a. Default a => a
def

expr :: Default a => Expression a -> Statement a
expr :: Expression a -> Statement a
expr = a -> Expression a -> Statement a
forall a. a -> Expression a -> Statement a
ExprStmt a
forall a. Default a => a
def

ifte
  :: Default a =>
     Expression a -> Statement a -> Statement a -> Statement a
ifte :: Expression a -> Statement a -> Statement a -> Statement a
ifte = a -> Expression a -> Statement a -> Statement a -> Statement a
forall a.
a -> Expression a -> Statement a -> Statement a -> Statement a
IfStmt a
forall a. Default a => a
def

ift :: Default a => Expression a -> Statement a -> Statement a
ift :: Expression a -> Statement a -> Statement a
ift  = a -> Expression a -> Statement a -> Statement a
forall a. a -> Expression a -> Statement a -> Statement a
IfSingleStmt a
forall a. Default a => a
def

switch
  :: Default a => Expression a -> [CaseClause a] -> Statement a
switch :: Expression a -> [CaseClause a] -> Statement a
switch = a -> Expression a -> [CaseClause a] -> Statement a
forall a. a -> Expression a -> [CaseClause a] -> Statement a
SwitchStmt a
forall a. Default a => a
def

while :: Default a => Expression a -> Statement a -> Statement a
while :: Expression a -> Statement a -> Statement a
while = a -> Expression a -> Statement a -> Statement a
forall a. a -> Expression a -> Statement a -> Statement a
WhileStmt a
forall a. Default a => a
def

dowhile :: Default a => Statement a -> Expression a -> Statement a
dowhile :: Statement a -> Expression a -> Statement a
dowhile = a -> Statement a -> Expression a -> Statement a
forall a. a -> Statement a -> Expression a -> Statement a
DoWhileStmt a
forall a. Default a => a
def

break :: Default a => Maybe (Id a) -> Statement a
break :: Maybe (Id a) -> Statement a
break = a -> Maybe (Id a) -> Statement a
forall a. a -> Maybe (Id a) -> Statement a
BreakStmt a
forall a. Default a => a
def

continue :: Default a => Maybe (Id a) -> Statement a
continue :: Maybe (Id a) -> Statement a
continue = a -> Maybe (Id a) -> Statement a
forall a. a -> Maybe (Id a) -> Statement a
ContinueStmt a
forall a. Default a => a
def

label :: Default a => Id a -> Statement a -> Statement a
label :: Id a -> Statement a -> Statement a
label = a -> Id a -> Statement a -> Statement a
forall a. a -> Id a -> Statement a -> Statement a
LabelledStmt a
forall a. Default a => a
def

forin
  :: Default a =>
     ForInInit a -> Expression a -> Statement a -> Statement a
forin :: ForInInit a -> Expression a -> Statement a -> Statement a
forin = a -> ForInInit a -> Expression a -> Statement a -> Statement a
forall a.
a -> ForInInit a -> Expression a -> Statement a -> Statement a
ForInStmt a
forall a. Default a => a
def

for
  :: Default a =>
     ForInit a
     -> Maybe (Expression a)
     -> Maybe (Expression a)
     -> Statement a
     -> Statement a
for :: ForInit a
-> Maybe (Expression a)
-> Maybe (Expression a)
-> Statement a
-> Statement a
for = a
-> ForInit a
-> Maybe (Expression a)
-> Maybe (Expression a)
-> Statement a
-> Statement a
forall a.
a
-> ForInit a
-> Maybe (Expression a)
-> Maybe (Expression a)
-> Statement a
-> Statement a
ForStmt a
forall a. Default a => a
def

try :: Default a => Statement a -> Statement a
try :: Statement a -> Statement a
try Statement a
b = a
-> Statement a
-> Maybe (CatchClause a)
-> Maybe (Statement a)
-> Statement a
forall a.
a
-> Statement a
-> Maybe (CatchClause a)
-> Maybe (Statement a)
-> Statement a
TryStmt a
forall a. Default a => a
def Statement a
b Maybe (CatchClause a)
forall a. Maybe a
Nothing Maybe (Statement a)
forall a. Maybe a
Nothing

trycatch
  :: Default a =>
     Statement a -> CatchClause a -> Maybe (Statement a) -> Statement a
trycatch :: Statement a -> CatchClause a -> Maybe (Statement a) -> Statement a
trycatch Statement a
b CatchClause a
c = a
-> Statement a
-> Maybe (CatchClause a)
-> Maybe (Statement a)
-> Statement a
forall a.
a
-> Statement a
-> Maybe (CatchClause a)
-> Maybe (Statement a)
-> Statement a
TryStmt a
forall a. Default a => a
def Statement a
b (CatchClause a -> Maybe (CatchClause a)
forall a. a -> Maybe a
Just CatchClause a
c)

tryfinally
  :: Default a => Statement a -> Statement a -> Statement a
tryfinally :: Statement a -> Statement a -> Statement a
tryfinally Statement a
b Statement a
f = a
-> Statement a
-> Maybe (CatchClause a)
-> Maybe (Statement a)
-> Statement a
forall a.
a
-> Statement a
-> Maybe (CatchClause a)
-> Maybe (Statement a)
-> Statement a
TryStmt a
forall a. Default a => a
def Statement a
b Maybe (CatchClause a)
forall a. Maybe a
Nothing (Statement a -> Maybe (Statement a)
forall a. a -> Maybe a
Just Statement a
f)

trycatchfinally
  :: Default a =>
     Statement a -> CatchClause a -> Statement a -> Statement a
trycatchfinally :: Statement a -> CatchClause a -> Statement a -> Statement a
trycatchfinally Statement a
b CatchClause a
c Statement a
f = a
-> Statement a
-> Maybe (CatchClause a)
-> Maybe (Statement a)
-> Statement a
forall a.
a
-> Statement a
-> Maybe (CatchClause a)
-> Maybe (Statement a)
-> Statement a
TryStmt a
forall a. Default a => a
def Statement a
b (CatchClause a -> Maybe (CatchClause a)
forall a. a -> Maybe a
Just CatchClause a
c) (Statement a -> Maybe (Statement a)
forall a. a -> Maybe a
Just Statement a
f)

throw :: Default a => Expression a -> Statement a
throw :: Expression a -> Statement a
throw = a -> Expression a -> Statement a
forall a. a -> Expression a -> Statement a
ThrowStmt a
forall a. Default a => a
def

returns :: Default a => Expression a -> Statement a
returns :: Expression a -> Statement a
returns = a -> Maybe (Expression a) -> Statement a
forall a. a -> Maybe (Expression a) -> Statement a
ReturnStmt a
forall a. Default a => a
def (Maybe (Expression a) -> Statement a)
-> (Expression a -> Maybe (Expression a))
-> Expression a
-> Statement a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expression a -> Maybe (Expression a)
forall a. a -> Maybe a
Just

ret :: Default a => Statement a
ret :: Statement a
ret = a -> Maybe (Expression a) -> Statement a
forall a. a -> Maybe (Expression a) -> Statement a
ReturnStmt a
forall a. Default a => a
def Maybe (Expression a)
forall a. Maybe a
Nothing

with :: Default a => Expression a -> Statement a -> Statement a
with :: Expression a -> Statement a -> Statement a
with = a -> Expression a -> Statement a -> Statement a
forall a. a -> Expression a -> Statement a -> Statement a
WithStmt a
forall a. Default a => a
def

vardecls :: Default a => [VarDecl a] -> Statement a
vardecls :: [VarDecl a] -> Statement a
vardecls = a -> [VarDecl a] -> Statement a
forall a. a -> [VarDecl a] -> Statement a
VarDeclStmt a
forall a. Default a => a
def

function
  :: Default a => Id a -> [Id a] -> [Statement a] -> Statement a
function :: Id a -> [Id a] -> [Statement a] -> Statement a
function = a -> Id a -> [Id a] -> [Statement a] -> Statement a
forall a. a -> Id a -> [Id a] -> [Statement a] -> Statement a
FunctionStmt a
forall a. Default a => a
def

-- | Convert an identifier to a String literal
id2string :: Id a -> Expression a
id2string :: Id a -> Expression a
id2string (Id a
a String
s) = a -> String -> Expression a
forall a. a -> String -> Expression a
StringLit a
a String
s

-- | Helper function to convert LValues to expressions
lv2e :: LValue a -> Expression a
lv2e :: LValue a -> Expression a
lv2e LValue a
lval = case LValue a
lval of
  LVar a
a String
vname -> a -> Id a -> Expression a
forall a. a -> Id a -> Expression a
VarRef a
a (a -> String -> Id a
forall a. a -> String -> Id a
Id a
a String
vname)
  LDot a
a Expression a
obj String
fname -> a -> Expression a -> Id a -> Expression a
forall a. a -> Expression a -> Id a -> Expression a
DotRef a
a Expression a
obj (a -> String -> Id a
forall a. a -> String -> Id a
Id a
a String
fname)
  LBracket a
a Expression a
obj Expression a
field -> a -> Expression a -> Expression a -> Expression a
forall a. a -> Expression a -> Expression a -> Expression a
BracketRef a
a Expression a
obj Expression a
field

-- | Convert an expression to an l-value. May fail with an error
e2lv :: Expression a -> LValue a
e2lv :: Expression a -> LValue a
e2lv Expression a
e = case Expression a
e of
  VarRef a
a (Id a
_ String
vname) -> a -> String -> LValue a
forall a. a -> String -> LValue a
LVar a
a String
vname
  DotRef a
a Expression a
obj (Id a
_ String
fname) -> a -> Expression a -> String -> LValue a
forall a. a -> Expression a -> String -> LValue a
LDot a
a Expression a
obj String
fname
  BracketRef a
a Expression a
obj Expression a
field -> a -> Expression a -> Expression a -> LValue a
forall a. a -> Expression a -> Expression a -> LValue a
LBracket a
a Expression a
obj Expression a
field
  Expression a
_ -> String -> LValue a
forall a. HasCallStack => String -> a
error String
"expr2LVal: Can't convert an expression to an LValue"
  
forInInit2lv :: ForInInit a -> LValue a
forInInit2lv :: ForInInit a -> LValue a
forInInit2lv ForInInit a
i = case ForInInit a
i of
  ForInVar (Id a
a String
s) -> a -> String -> LValue a
forall a. a -> String -> LValue a
LVar a
a String
s
  ForInLVal LValue a
lv      -> LValue a
lv