module Language.Javascript.JMacro.Util where

import Prelude hiding (tail, init, head, last, minimum, maximum, foldr1, foldl1, (!!), read, (<), (&&))

import qualified Prelude as P
import Language.Javascript.JMacro.Base

(.) :: JExpr -> String -> JExpr
JExpr
x . :: JExpr -> String -> JExpr
. String
y = JExpr -> Ident -> JExpr
SelExpr JExpr
x (String -> Ident
StrI String
y)

(<>) :: (ToJExpr a) => JExpr -> a -> JExpr
JExpr
x <> :: forall a. ToJExpr a => JExpr -> a -> JExpr
<> a
y = JExpr -> JExpr -> JExpr
IdxExpr JExpr
x (forall a. ToJExpr a => a -> JExpr
toJExpr a
y)

infixl 2 =:
(=:) :: ToJExpr a => JExpr -> a -> JStat
JExpr
x =: :: forall a. ToJExpr a => JExpr -> a -> JStat
=:  a
y = JExpr -> JExpr -> JStat
AssignStat JExpr
x (forall a. ToJExpr a => a -> JExpr
toJExpr a
y)

($) :: (ToJExpr a, ToJExpr b) => a -> b -> JExpr
a
x $ :: forall a b. (ToJExpr a, ToJExpr b) => a -> b -> JExpr
$  b
y = JExpr -> [JExpr] -> JExpr
ApplExpr (forall a. ToJExpr a => a -> JExpr
toJExpr a
x) (forall a. ToJExpr a => a -> [JExpr]
toJExprList b
y)

($$) :: (ToJExpr a, ToJExpr b) => a -> b -> JStat
a
x $$ :: forall a b. (ToJExpr a, ToJExpr b) => a -> b -> JStat
$$  b
y = JExpr -> [JExpr] -> JStat
ApplStat (forall a. ToJExpr a => a -> JExpr
toJExpr a
x) (forall a. ToJExpr a => a -> [JExpr]
toJExprList b
y)

(==), (!=), (<), (&&) :: JExpr -> JExpr -> JExpr
JExpr
x == :: JExpr -> JExpr -> JExpr
== JExpr
y = String -> JExpr -> JExpr -> JExpr
InfixExpr String
"==" JExpr
x JExpr
y
JExpr
x != :: JExpr -> JExpr -> JExpr
!= JExpr
y = String -> JExpr -> JExpr -> JExpr
InfixExpr String
"!=" JExpr
x JExpr
y

infix 4 <
JExpr
x < :: JExpr -> JExpr -> JExpr
< JExpr
y = String -> JExpr -> JExpr -> JExpr
InfixExpr String
"<" JExpr
x JExpr
y
infixr 3 &&
JExpr
x && :: JExpr -> JExpr -> JExpr
&& JExpr
y = String -> JExpr -> JExpr -> JExpr
InfixExpr String
"&&" JExpr
x JExpr
y

null :: JExpr
null :: JExpr
null  = String -> JExpr
jsv String
"null"

new :: ToJExpr a => a -> JExpr
new :: forall a. ToJExpr a => a -> JExpr
new a
x = JExpr -> JExpr
NewExpr (forall a. ToJExpr a => a -> JExpr
toJExpr a
x)

if' :: (ToJExpr a, ToStat b) => a -> b -> JStat
if' :: forall a b. (ToJExpr a, ToStat b) => a -> b -> JStat
if' a
x b
y       = JExpr -> JStat -> JStat -> JStat
IfStat (forall a. ToJExpr a => a -> JExpr
toJExpr a
x) (forall a. ToStat a => a -> JStat
toStat b
y) ([JStat] -> JStat
BlockStat [])

ifElse :: (ToJExpr a, ToStat b, ToStat c) => a -> b -> c -> JStat
ifElse :: forall a b c.
(ToJExpr a, ToStat b, ToStat c) =>
a -> b -> c -> JStat
ifElse a
x b
y c
z = JExpr -> JStat -> JStat -> JStat
IfStat (forall a. ToJExpr a => a -> JExpr
toJExpr a
x) (forall a. ToStat a => a -> JStat
toStat b
y) (forall a. ToStat a => a -> JStat
toStat c
z)

while :: ToJExpr a => a -> JStat -> JStat
while :: forall a. ToJExpr a => a -> JStat -> JStat
while a
x JStat
y = Bool -> JExpr -> JStat -> JStat
WhileStat Bool
False (forall a. ToJExpr a => a -> JExpr
toJExpr a
x) JStat
y

return :: ToJExpr a => a -> JStat
return :: forall a. ToJExpr a => a -> JStat
return a
x = JExpr -> JStat
ReturnStat (forall a. ToJExpr a => a -> JExpr
toJExpr a
x)


toJExprList :: ToJExpr a => a -> [JExpr]
toJExprList :: forall a. ToJExpr a => a -> [JExpr]
toJExprList a
x = case forall a. ToJExpr a => a -> JExpr
toJExpr a
x of
                  (ValExpr (JList [JExpr]
l)) -> [JExpr]
l
                  JExpr
x' -> [JExpr
x']


jstr :: P.String -> JExpr
jstr :: String -> JExpr
jstr = JVal -> JExpr
ValExpr forall b c a. (b -> c) -> (a -> b) -> a -> c
P.. String -> JVal
JStr