{-# 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 :: forall a. Default a => [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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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_ :: forall a. Default a => 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 :: forall a. Default a => [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 :: forall a. Default a => [(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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a.
Default a =>
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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a.
Default a =>
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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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_ :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a.
Default a =>
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 :: forall a.
Default a =>
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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => [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 :: forall a.
Default a =>
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 :: forall a.
Default a =>
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 :: forall a. Default a => [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 :: forall a.
Default a =>
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 :: forall a. Default a => [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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => [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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a.
Default a =>
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 :: forall a. Default a => 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 :: forall a.
Default a =>
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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a.
Default a =>
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 :: forall a.
Default a =>
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 :: forall a. Default a => 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 :: forall a.
Default a =>
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 :: forall a. Default a => 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 :: forall a.
Default a =>
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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => 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 :: forall a. Default a => [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 :: forall a.
Default a =>
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 :: forall a. 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 :: forall a. 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 :: forall a. 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 :: forall a. 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