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
x :: JExpr
x . :: JExpr -> String -> JExpr
. y :: String
y = JExpr -> Ident -> JExpr
SelExpr JExpr
x (String -> Ident
StrI String
y)

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

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

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

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

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

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

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

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

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

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

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

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


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


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