{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module GHC.JS.Make
(
ToJExpr(..)
, ToStat(..)
, JVarMagic(..)
, JSArgument(..)
, jString
, jLam, jLam', jFunction, jFunctionSized, jFunction'
, jVar, jVars, jFor, jForIn, jForEachIn, jTryCatchFinally
, (||=), (|=), (.==.), (.===.), (.!=.), (.!==.), (.!)
, (.>.), (.>=.), (.<.), (.<=.)
, (.<<.), (.>>.), (.>>>.)
, (.|.), (.||.), (.&&.)
, if_, if10, if01, ifS, ifBlockS, jBlock, jIf
, jwhenS
, app, appS, returnS
, loop, loopBlockS
, preIncrS, postIncrS
, preDecrS, postDecrS
, off8, off16, off32, off64
, mask8, mask16
, signExtend8, signExtend16
, typeOf
, returnStack, assignAllEqual, assignAll, assignAllReverseOrder
, declAssignAll
, nullStat, (.^)
, jhEmpty
, jhSingle
, jhAdd
, jhFromList
, null_
, undefined_
, false_
, true_
, zero_
, one_
, two_
, three_
, math_log, math_sin, math_cos, math_tan, math_exp, math_acos, math_asin,
math_atan, math_abs, math_pow, math_sqrt, math_asinh, math_acosh, math_atanh,
math_cosh, math_sinh, math_tanh, math_expm1, math_log1p, math_fround,
math_min, math_max
, Solo(..)
, decl
#if __GLASGOW_HASKELL__ < 905
, pattern MkSolo
#endif
)
where
import GHC.Prelude hiding ((.|.))
import GHC.JS.Ident
import GHC.JS.JStg.Syntax
import GHC.JS.JStg.Monad
import GHC.JS.Transform
import Control.Arrow ((***))
import Control.Monad (replicateM)
import Data.Tuple
import qualified Data.Map as M
import GHC.Data.FastString
import GHC.Utils.Misc
import GHC.Types.Unique.Map
class ToJExpr a where
toJExpr :: a -> JStgExpr
toJExprFromList :: [a] -> JStgExpr
toJExprFromList = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr) -> ([a] -> JVal) -> [a] -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [JStgExpr] -> JVal
JList ([JStgExpr] -> JVal) -> ([a] -> [JStgExpr]) -> [a] -> JVal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> JStgExpr) -> [a] -> [JStgExpr]
forall a b. (a -> b) -> [a] -> [b]
map a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr
instance ToJExpr a => ToJExpr [a] where
toJExpr :: [a] -> JStgExpr
toJExpr = [a] -> JStgExpr
forall a. ToJExpr a => [a] -> JStgExpr
toJExprFromList
instance ToJExpr JStgExpr where
toJExpr :: JStgExpr -> JStgExpr
toJExpr = JStgExpr -> JStgExpr
forall a. a -> a
id
instance ToJExpr () where
toJExpr :: () -> JStgExpr
toJExpr ()
_ = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr) -> JVal -> JStgExpr
forall a b. (a -> b) -> a -> b
$ [JStgExpr] -> JVal
JList []
instance ToJExpr Bool where
toJExpr :: Bool -> JStgExpr
toJExpr Bool
True = FastString -> JStgExpr
global FastString
"true"
toJExpr Bool
False = FastString -> JStgExpr
global FastString
"false"
instance ToJExpr JVal where
toJExpr :: JVal -> JStgExpr
toJExpr = JVal -> JStgExpr
ValExpr
instance ToJExpr a => ToJExpr (UniqMap FastString a) where
toJExpr :: UniqMap FastString a -> JStgExpr
toJExpr = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr)
-> (UniqMap FastString a -> JVal)
-> UniqMap FastString a
-> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniqMap FastString JStgExpr -> JVal
JHash (UniqMap FastString JStgExpr -> JVal)
-> (UniqMap FastString a -> UniqMap FastString JStgExpr)
-> UniqMap FastString a
-> JVal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> JStgExpr)
-> UniqMap FastString a -> UniqMap FastString JStgExpr
forall a b k. (a -> b) -> UniqMap k a -> UniqMap k b
mapUniqMap a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr
instance ToJExpr a => ToJExpr (M.Map String a) where
toJExpr :: Map String a -> JStgExpr
toJExpr = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr)
-> (Map String a -> JVal) -> Map String a -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniqMap FastString JStgExpr -> JVal
JHash (UniqMap FastString JStgExpr -> JVal)
-> (Map String a -> UniqMap FastString JStgExpr)
-> Map String a
-> JVal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(FastString, JStgExpr)] -> UniqMap FastString JStgExpr
forall k a. Uniquable k => [(k, a)] -> UniqMap k a
listToUniqMap ([(FastString, JStgExpr)] -> UniqMap FastString JStgExpr)
-> (Map String a -> [(FastString, JStgExpr)])
-> Map String a
-> UniqMap FastString JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String, a) -> (FastString, JStgExpr))
-> [(String, a)] -> [(FastString, JStgExpr)]
forall a b. (a -> b) -> [a] -> [b]
map (String -> FastString
mkFastString (String -> FastString)
-> (a -> JStgExpr) -> (String, a) -> (FastString, JStgExpr)
forall b c b' c'. (b -> c) -> (b' -> c') -> (b, b') -> (c, c')
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr) ([(String, a)] -> [(FastString, JStgExpr)])
-> (Map String a -> [(String, a)])
-> Map String a
-> [(FastString, JStgExpr)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map String a -> [(String, a)]
forall k a. Map k a -> [(k, a)]
M.toList
instance ToJExpr Double where
toJExpr :: Double -> JStgExpr
toJExpr = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr) -> (Double -> JVal) -> Double -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SaneDouble -> JVal
JDouble (SaneDouble -> JVal) -> (Double -> SaneDouble) -> Double -> JVal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> SaneDouble
SaneDouble
instance ToJExpr Int where
toJExpr :: Int -> JStgExpr
toJExpr = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr) -> (Int -> JVal) -> Int -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> JVal
JInt (Integer -> JVal) -> (Int -> Integer) -> Int -> JVal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral
instance ToJExpr Integer where
toJExpr :: Integer -> JStgExpr
toJExpr = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr) -> (Integer -> JVal) -> Integer -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> JVal
JInt
instance ToJExpr Char where
toJExpr :: Char -> JStgExpr
toJExpr = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr) -> (Char -> JVal) -> Char -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FastString -> JVal
JStr (FastString -> JVal) -> (Char -> FastString) -> Char -> JVal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> FastString
mkFastString (String -> FastString) -> (Char -> String) -> Char -> FastString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> String -> String
forall a. a -> [a] -> [a]
:[])
toJExprFromList :: String -> JStgExpr
toJExprFromList = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr) -> (String -> JVal) -> String -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FastString -> JVal
JStr (FastString -> JVal) -> (String -> FastString) -> String -> JVal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> FastString
mkFastString
instance ToJExpr Ident where
toJExpr :: Ident -> JStgExpr
toJExpr = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr) -> (Ident -> JVal) -> Ident -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ident -> JVal
JVar
instance ToJExpr FastString where
toJExpr :: FastString -> JStgExpr
toJExpr = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr)
-> (FastString -> JVal) -> FastString -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FastString -> JVal
JStr
instance (ToJExpr a, ToJExpr b) => ToJExpr (a,b) where
toJExpr :: (a, b) -> JStgExpr
toJExpr (a
a,b
b) = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr)
-> ([JStgExpr] -> JVal) -> [JStgExpr] -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [JStgExpr] -> JVal
JList ([JStgExpr] -> JStgExpr) -> [JStgExpr] -> JStgExpr
forall a b. (a -> b) -> a -> b
$ [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a, b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b]
instance (ToJExpr a, ToJExpr b, ToJExpr c) => ToJExpr (a,b,c) where
toJExpr :: (a, b, c) -> JStgExpr
toJExpr (a
a,b
b,c
c) = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr)
-> ([JStgExpr] -> JVal) -> [JStgExpr] -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [JStgExpr] -> JVal
JList ([JStgExpr] -> JStgExpr) -> [JStgExpr] -> JStgExpr
forall a b. (a -> b) -> a -> b
$ [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a, b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b, c -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr c
c]
instance (ToJExpr a, ToJExpr b, ToJExpr c, ToJExpr d) => ToJExpr (a,b,c,d) where
toJExpr :: (a, b, c, d) -> JStgExpr
toJExpr (a
a,b
b,c
c,d
d) = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr)
-> ([JStgExpr] -> JVal) -> [JStgExpr] -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [JStgExpr] -> JVal
JList ([JStgExpr] -> JStgExpr) -> [JStgExpr] -> JStgExpr
forall a b. (a -> b) -> a -> b
$ [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a, b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b, c -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr c
c, d -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr d
d]
instance (ToJExpr a, ToJExpr b, ToJExpr c, ToJExpr d, ToJExpr e) => ToJExpr (a,b,c,d,e) where
toJExpr :: (a, b, c, d, e) -> JStgExpr
toJExpr (a
a,b
b,c
c,d
d,e
e) = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr)
-> ([JStgExpr] -> JVal) -> [JStgExpr] -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [JStgExpr] -> JVal
JList ([JStgExpr] -> JStgExpr) -> [JStgExpr] -> JStgExpr
forall a b. (a -> b) -> a -> b
$ [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a, b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b, c -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr c
c, d -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr d
d, e -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr e
e]
instance (ToJExpr a, ToJExpr b, ToJExpr c, ToJExpr d, ToJExpr e, ToJExpr f) => ToJExpr (a,b,c,d,e,f) where
toJExpr :: (a, b, c, d, e, f) -> JStgExpr
toJExpr (a
a,b
b,c
c,d
d,e
e,f
f) = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr)
-> ([JStgExpr] -> JVal) -> [JStgExpr] -> JStgExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [JStgExpr] -> JVal
JList ([JStgExpr] -> JStgExpr) -> [JStgExpr] -> JStgExpr
forall a b. (a -> b) -> a -> b
$ [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a, b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b, c -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr c
c, d -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr d
d, e -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr e
e, f -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr f
f]
class ToStat a where
toStat :: a -> JStgStat
instance ToStat JStgStat where
toStat :: JStgStat -> JStgStat
toStat = JStgStat -> JStgStat
forall a. a -> a
id
instance ToStat [JStgStat] where
toStat :: [JStgStat] -> JStgStat
toStat = [JStgStat] -> JStgStat
BlockStat
instance ToStat JStgExpr where
toStat :: JStgExpr -> JStgStat
toStat = JStgExpr -> JStgStat
expr2stat
instance ToStat [JStgExpr] where
toStat :: [JStgExpr] -> JStgStat
toStat = [JStgStat] -> JStgStat
BlockStat ([JStgStat] -> JStgStat)
-> ([JStgExpr] -> [JStgStat]) -> [JStgExpr] -> JStgStat
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (JStgExpr -> JStgStat) -> [JStgExpr] -> [JStgStat]
forall a b. (a -> b) -> [a] -> [b]
map JStgExpr -> JStgStat
expr2stat
expr2stat :: JStgExpr -> JStgStat
expr2stat :: JStgExpr -> JStgStat
expr2stat (ApplExpr JStgExpr
x [JStgExpr]
y) = (JStgExpr -> [JStgExpr] -> JStgStat
ApplStat JStgExpr
x [JStgExpr]
y)
expr2stat (IfExpr JStgExpr
x JStgExpr
y JStgExpr
z) = JStgExpr -> JStgStat -> JStgStat -> JStgStat
IfStat JStgExpr
x (JStgExpr -> JStgStat
expr2stat JStgExpr
y) (JStgExpr -> JStgStat
expr2stat JStgExpr
z)
expr2stat (UOpExpr UOp
o JStgExpr
x) = UOp -> JStgExpr -> JStgStat
UOpStat UOp
o JStgExpr
x
expr2stat JStgExpr
_ = JStgStat
nullStat
jLam :: JSArgument args => (args -> JSM JStgStat) -> JSM JStgExpr
jLam :: forall args.
JSArgument args =>
(args -> JSM JStgStat) -> JSM JStgExpr
jLam args -> JSM JStgStat
body = do xs <- JSM args
forall args. JSArgument args => JSM args
args
ValExpr . JFunc (argList xs) <$> body xs
jLam' :: JStgStat -> JStgExpr
jLam' :: JStgStat -> JStgExpr
jLam' JStgStat
body = JVal -> JStgExpr
ValExpr (JVal -> JStgExpr) -> JVal -> JStgExpr
forall a b. (a -> b) -> a -> b
$ [Ident] -> JStgStat -> JVal
JFunc [Ident]
forall a. Monoid a => a
mempty JStgStat
body
jVar :: (JVarMagic t, ToJExpr t) => (t -> JSM JStgStat) -> JSM JStgStat
jVar :: forall t.
(JVarMagic t, ToJExpr t) =>
(t -> JSM JStgStat) -> JSM JStgStat
jVar t -> JSM JStgStat
f = (Solo t -> JSM JStgStat) -> JSM JStgStat
forall args.
JSArgument args =>
(args -> JSM JStgStat) -> JSM JStgStat
jVars ((Solo t -> JSM JStgStat) -> JSM JStgStat)
-> (Solo t -> JSM JStgStat) -> JSM JStgStat
forall a b. (a -> b) -> a -> b
$ \(MkSolo t
only_one) -> t -> JSM JStgStat
f t
only_one
jVars :: (JSArgument args) => (args -> JSM JStgStat) -> JSM JStgStat
jVars :: forall args.
JSArgument args =>
(args -> JSM JStgStat) -> JSM JStgStat
jVars args -> JSM JStgStat
f = do as <- JSM args
forall args. JSArgument args => JSM args
args
body <- f as
return $ mconcat $ fmap decl (argList as) ++ [body]
jFunction
:: (JSArgument args)
=> Ident
-> (args -> JSM JStgStat)
-> JSM JStgStat
jFunction :: forall args.
JSArgument args =>
Ident -> (args -> JSM JStgStat) -> JSM JStgStat
jFunction Ident
name args -> JSM JStgStat
body = do
func_args <- JSM args
forall args. JSArgument args => JSM args
args
FuncStat name (argList func_args) <$> (body func_args)
jFunctionSized
:: Ident
-> Int
-> ([JStgExpr] -> JSM JStgStat)
-> JSM JStgStat
jFunctionSized :: Ident -> Int -> ([JStgExpr] -> JSM JStgStat) -> JSM JStgStat
jFunctionSized Ident
name Int
arity [JStgExpr] -> JSM JStgStat
body = do
func_args <- Int -> StateT JEnv Identity Ident -> StateT JEnv Identity [Ident]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
arity StateT JEnv Identity Ident
newIdent
FuncStat name func_args <$> (body $ toJExpr <$> func_args)
jFunction'
:: Ident
-> JSM JStgStat
-> JSM JStgStat
jFunction' :: Ident -> JSM JStgStat -> JSM JStgStat
jFunction' Ident
name JSM JStgStat
body = Ident -> [Ident] -> JStgStat -> JStgStat
FuncStat Ident
name [Ident]
forall a. Monoid a => a
mempty (JStgStat -> JStgStat) -> JSM JStgStat -> JSM JStgStat
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JSM JStgStat
body
jBlock :: Monoid a => [JSM a] -> JSM a
jBlock :: forall a. Monoid a => [JSM a] -> JSM a
jBlock = ([a] -> a) -> StateT JEnv Identity [a] -> StateT JEnv Identity a
forall a b.
(a -> b) -> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> a
forall a. Monoid a => [a] -> a
mconcat (StateT JEnv Identity [a] -> StateT JEnv Identity a)
-> ([StateT JEnv Identity a] -> StateT JEnv Identity [a])
-> [StateT JEnv Identity a]
-> StateT JEnv Identity a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [StateT JEnv Identity a] -> StateT JEnv Identity [a]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence
jForIn :: JStgExpr -> (JStgExpr -> JStgStat) -> JSM JStgStat
jForIn :: JStgExpr -> (JStgExpr -> JStgStat) -> JSM JStgStat
jForIn JStgExpr
e JStgExpr -> JStgStat
f = do
i <- StateT JEnv Identity Ident
newIdent
return $ decl i `mappend` ForInStat False i e (f (ValExpr $! JVar i))
jForEachIn :: JStgExpr -> (JStgExpr -> JStgStat) -> JSM JStgStat
jForEachIn :: JStgExpr -> (JStgExpr -> JStgStat) -> JSM JStgStat
jForEachIn JStgExpr
e JStgExpr -> JStgStat
f = do i <- StateT JEnv Identity Ident
newIdent
return $ decl i `mappend` ForInStat True i e (f (ValExpr $! JVar i))
jFor :: (JStgExpr -> JStgStat)
-> (JStgExpr -> JStgExpr)
-> (JStgExpr -> JStgStat)
-> (JStgExpr -> JStgStat)
-> JSM JStgStat
jFor :: (JStgExpr -> JStgStat)
-> (JStgExpr -> JStgExpr)
-> (JStgExpr -> JStgStat)
-> (JStgExpr -> JStgStat)
-> JSM JStgStat
jFor JStgExpr -> JStgStat
init JStgExpr -> JStgExpr
pred JStgExpr -> JStgStat
step JStgExpr -> JStgStat
body = do id <- StateT JEnv Identity Ident
newIdent
let i = JVal -> JStgExpr
ValExpr (Ident -> JVal
JVar Ident
id)
return
$ decl id `mappend` ForStat (init i) (pred i) (step i) (body i)
jTryCatchFinally :: (Ident -> JStgStat) -> (Ident -> JStgStat) -> (Ident -> JStgStat) -> JSM JStgStat
jTryCatchFinally :: (Ident -> JStgStat)
-> (Ident -> JStgStat) -> (Ident -> JStgStat) -> JSM JStgStat
jTryCatchFinally Ident -> JStgStat
c Ident -> JStgStat
f Ident -> JStgStat
f2 = do i <- StateT JEnv Identity Ident
newIdent
return $ TryStat (c i) i (f i) (f2 i)
jString :: FastString -> JStgExpr
jString :: FastString -> JStgExpr
jString = FastString -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr
decl :: Ident -> JStgStat
decl :: Ident -> JStgStat
decl Ident
i = Ident -> Maybe JStgExpr -> JStgStat
DeclStat Ident
i Maybe JStgExpr
forall a. Maybe a
Nothing
jhEmpty :: M.Map k JStgExpr
jhEmpty :: forall k. Map k JStgExpr
jhEmpty = Map k JStgExpr
forall k a. Map k a
M.empty
jhSingle :: (Ord k, ToJExpr a) => k -> a -> M.Map k JStgExpr
jhSingle :: forall k a. (Ord k, ToJExpr a) => k -> a -> Map k JStgExpr
jhSingle k
k a
v = k -> a -> Map k JStgExpr -> Map k JStgExpr
forall k a.
(Ord k, ToJExpr a) =>
k -> a -> Map k JStgExpr -> Map k JStgExpr
jhAdd k
k a
v Map k JStgExpr
forall k. Map k JStgExpr
jhEmpty
jhAdd :: (Ord k, ToJExpr a) => k -> a -> M.Map k JStgExpr -> M.Map k JStgExpr
jhAdd :: forall k a.
(Ord k, ToJExpr a) =>
k -> a -> Map k JStgExpr -> Map k JStgExpr
jhAdd k
k a
v Map k JStgExpr
m = k -> JStgExpr -> Map k JStgExpr -> Map k JStgExpr
forall k a. Ord k => k -> a -> Map k a -> Map k a
M.insert k
k (a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
v) Map k JStgExpr
m
jhFromList :: [(FastString, JStgExpr)] -> JVal
jhFromList :: [(FastString, JStgExpr)] -> JVal
jhFromList = UniqMap FastString JStgExpr -> JVal
JHash (UniqMap FastString JStgExpr -> JVal)
-> ([(FastString, JStgExpr)] -> UniqMap FastString JStgExpr)
-> [(FastString, JStgExpr)]
-> JVal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(FastString, JStgExpr)] -> UniqMap FastString JStgExpr
forall k a. Uniquable k => [(k, a)] -> UniqMap k a
listToUniqMap
nullStat :: JStgStat
nullStat :: JStgStat
nullStat = [JStgStat] -> JStgStat
BlockStat []
(.==.), (.===.), (.!=.), (.!==.) :: JStgExpr -> JStgExpr -> JStgExpr
.==. :: JStgExpr -> JStgExpr -> JStgExpr
(.==.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
EqOp
.===. :: JStgExpr -> JStgExpr -> JStgExpr
(.===.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
StrictEqOp
.!=. :: JStgExpr -> JStgExpr -> JStgExpr
(.!=.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
NeqOp
.!==. :: JStgExpr -> JStgExpr -> JStgExpr
(.!==.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
StrictNeqOp
infixl 6 .==., .===., .!=., .!==.
(.>.), (.>=.), (.<.), (.<=.) :: JStgExpr -> JStgExpr -> JStgExpr
.>. :: JStgExpr -> JStgExpr -> JStgExpr
(.>.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
GtOp
.>=. :: JStgExpr -> JStgExpr -> JStgExpr
(.>=.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
GeOp
.<. :: JStgExpr -> JStgExpr -> JStgExpr
(.<.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
LtOp
.<=. :: JStgExpr -> JStgExpr -> JStgExpr
(.<=.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
LeOp
infixl 7 .>., .>=., .<., .<=.
(.|.), (.||.), (.&&.) :: JStgExpr -> JStgExpr -> JStgExpr
.|. :: JStgExpr -> JStgExpr -> JStgExpr
(.|.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
BOrOp
.||. :: JStgExpr -> JStgExpr -> JStgExpr
(.||.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
LOrOp
.&&. :: JStgExpr -> JStgExpr -> JStgExpr
(.&&.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
LAndOp
infixl 8 .||., .&&.
(.<<.), (.>>.), (.>>>.) :: JStgExpr -> JStgExpr -> JStgExpr
.<<. :: JStgExpr -> JStgExpr -> JStgExpr
(.<<.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
LeftShiftOp
.>>. :: JStgExpr -> JStgExpr -> JStgExpr
(.>>.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
RightShiftOp
.>>>. :: JStgExpr -> JStgExpr -> JStgExpr
(.>>>.) = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
ZRightShiftOp
infixl 9 .<<., .>>., .>>>.
typeOf :: JStgExpr -> JStgExpr
typeOf :: JStgExpr -> JStgExpr
typeOf = UOp -> JStgExpr -> JStgExpr
UOpExpr UOp
TypeofOp
if_ :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr
if_ :: JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr
if_ JStgExpr
e1 JStgExpr
e2 JStgExpr
e3 = JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr
IfExpr JStgExpr
e1 JStgExpr
e2 JStgExpr
e3
ifS :: JStgExpr -> JStgStat -> JStgStat -> JStgStat
ifS :: JStgExpr -> JStgStat -> JStgStat -> JStgStat
ifS JStgExpr
e JStgStat
s1 JStgStat
s2 = JStgExpr -> JStgStat -> JStgStat -> JStgStat
IfStat JStgExpr
e JStgStat
s1 JStgStat
s2
jIf :: JStgExpr -> JSM JStgStat -> JSM JStgStat -> JSM JStgStat
jIf :: JStgExpr -> JSM JStgStat -> JSM JStgStat -> JSM JStgStat
jIf JStgExpr
e JSM JStgStat
ma JSM JStgStat
mb = do
!a <- JSM JStgStat
ma
!b <- mb
pure $ IfStat e a b
jwhenS :: JStgExpr -> JStgStat -> JStgStat
jwhenS :: JStgExpr -> JStgStat -> JStgStat
jwhenS JStgExpr
cond JStgStat
block = JStgExpr -> JStgStat -> JStgStat -> JStgStat
IfStat JStgExpr
cond JStgStat
block JStgStat
forall a. Monoid a => a
mempty
ifBlockS :: JStgExpr -> [JStgStat] -> [JStgStat] -> JStgStat
ifBlockS :: JStgExpr -> [JStgStat] -> [JStgStat] -> JStgStat
ifBlockS JStgExpr
e [JStgStat]
s1 [JStgStat]
s2 = JStgExpr -> JStgStat -> JStgStat -> JStgStat
IfStat JStgExpr
e ([JStgStat] -> JStgStat
forall a. Monoid a => [a] -> a
mconcat [JStgStat]
s1) ([JStgStat] -> JStgStat
forall a. Monoid a => [a] -> a
mconcat [JStgStat]
s2)
if10 :: JStgExpr -> JStgExpr
if10 :: JStgExpr -> JStgExpr
if10 JStgExpr
e = JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr
IfExpr JStgExpr
e JStgExpr
one_ JStgExpr
zero_
if01 :: JStgExpr -> JStgExpr
if01 :: JStgExpr -> JStgExpr
if01 JStgExpr
e = JStgExpr -> JStgExpr -> JStgExpr -> JStgExpr
IfExpr JStgExpr
e JStgExpr
zero_ JStgExpr
one_
app :: FastString -> [JStgExpr] -> JStgExpr
app :: FastString -> [JStgExpr] -> JStgExpr
app FastString
f [JStgExpr]
xs = JStgExpr -> [JStgExpr] -> JStgExpr
ApplExpr (FastString -> JStgExpr
global FastString
f) [JStgExpr]
xs
appS :: FastString -> [JStgExpr] -> JStgStat
appS :: FastString -> [JStgExpr] -> JStgStat
appS FastString
f [JStgExpr]
xs = JStgExpr -> [JStgExpr] -> JStgStat
ApplStat (FastString -> JStgExpr
global FastString
f) [JStgExpr]
xs
returnS :: JStgExpr -> JStgStat
returnS :: JStgExpr -> JStgStat
returnS JStgExpr
e = JStgExpr -> JStgStat
ReturnStat JStgExpr
e
loop :: JStgExpr -> (JStgExpr -> JStgExpr) -> (JStgExpr -> JSM JStgStat) -> JSM JStgStat
loop :: JStgExpr
-> (JStgExpr -> JStgExpr)
-> (JStgExpr -> JSM JStgStat)
-> JSM JStgStat
loop JStgExpr
initial JStgExpr -> JStgExpr
test JStgExpr -> JSM JStgStat
body_ = (JStgExpr -> JSM JStgStat) -> JSM JStgStat
forall t.
(JVarMagic t, ToJExpr t) =>
(t -> JSM JStgStat) -> JSM JStgStat
jVar ((JStgExpr -> JSM JStgStat) -> JSM JStgStat)
-> (JStgExpr -> JSM JStgStat) -> JSM JStgStat
forall a b. (a -> b) -> a -> b
$ \JStgExpr
i ->
do body <- JStgExpr -> JSM JStgStat
body_ JStgExpr
i
return $
mconcat [ i |= initial
, WhileStat False (test i) body
]
loopBlockS :: JStgExpr -> (JStgExpr -> JStgExpr) -> (JStgExpr -> [JStgStat]) -> JSM JStgStat
loopBlockS :: JStgExpr
-> (JStgExpr -> JStgExpr)
-> (JStgExpr -> [JStgStat])
-> JSM JStgStat
loopBlockS JStgExpr
initial JStgExpr -> JStgExpr
test JStgExpr -> [JStgStat]
body = (JStgExpr -> JSM JStgStat) -> JSM JStgStat
forall t.
(JVarMagic t, ToJExpr t) =>
(t -> JSM JStgStat) -> JSM JStgStat
jVar ((JStgExpr -> JSM JStgStat) -> JSM JStgStat)
-> (JStgExpr -> JSM JStgStat) -> JSM JStgStat
forall a b. (a -> b) -> a -> b
$ \JStgExpr
i ->
JStgStat -> JSM JStgStat
forall a. a -> StateT JEnv Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (JStgStat -> JSM JStgStat) -> JStgStat -> JSM JStgStat
forall a b. (a -> b) -> a -> b
$
[JStgStat] -> JStgStat
forall a. Monoid a => [a] -> a
mconcat [ JStgExpr
i JStgExpr -> JStgExpr -> JStgStat
|= JStgExpr
initial
, Bool -> JStgExpr -> JStgStat -> JStgStat
WhileStat Bool
False (JStgExpr -> JStgExpr
test JStgExpr
i) ([JStgStat] -> JStgStat
forall a. Monoid a => [a] -> a
mconcat (JStgExpr -> [JStgStat]
body JStgExpr
i))
]
preIncrS :: JStgExpr -> JStgStat
preIncrS :: JStgExpr -> JStgStat
preIncrS JStgExpr
x = UOp -> JStgExpr -> JStgStat
UOpStat UOp
PreIncOp JStgExpr
x
postIncrS :: JStgExpr -> JStgStat
postIncrS :: JStgExpr -> JStgStat
postIncrS JStgExpr
x = UOp -> JStgExpr -> JStgStat
UOpStat UOp
PostIncOp JStgExpr
x
preDecrS :: JStgExpr -> JStgStat
preDecrS :: JStgExpr -> JStgStat
preDecrS JStgExpr
x = UOp -> JStgExpr -> JStgStat
UOpStat UOp
PreDecOp JStgExpr
x
postDecrS :: JStgExpr -> JStgStat
postDecrS :: JStgExpr -> JStgStat
postDecrS JStgExpr
x = UOp -> JStgExpr -> JStgStat
UOpStat UOp
PostDecOp JStgExpr
x
off64 :: JStgExpr -> JStgExpr -> JStgExpr
off64 :: JStgExpr -> JStgExpr -> JStgExpr
off64 JStgExpr
o JStgExpr
i = JStgExpr -> JStgExpr -> JStgExpr
Add JStgExpr
o (JStgExpr
i JStgExpr -> JStgExpr -> JStgExpr
.<<. JStgExpr
three_)
off32 :: JStgExpr -> JStgExpr -> JStgExpr
off32 :: JStgExpr -> JStgExpr -> JStgExpr
off32 JStgExpr
o JStgExpr
i = JStgExpr -> JStgExpr -> JStgExpr
Add JStgExpr
o (JStgExpr
i JStgExpr -> JStgExpr -> JStgExpr
.<<. JStgExpr
two_)
off16 :: JStgExpr -> JStgExpr -> JStgExpr
off16 :: JStgExpr -> JStgExpr -> JStgExpr
off16 JStgExpr
o JStgExpr
i = JStgExpr -> JStgExpr -> JStgExpr
Add JStgExpr
o (JStgExpr
i JStgExpr -> JStgExpr -> JStgExpr
.<<. JStgExpr
one_)
off8 :: JStgExpr -> JStgExpr -> JStgExpr
off8 :: JStgExpr -> JStgExpr -> JStgExpr
off8 JStgExpr
o JStgExpr
i = JStgExpr -> JStgExpr -> JStgExpr
Add JStgExpr
o JStgExpr
i
mask8 :: JStgExpr -> JStgExpr
mask8 :: JStgExpr -> JStgExpr
mask8 JStgExpr
x = JStgExpr -> JStgExpr -> JStgExpr
BAnd JStgExpr
x (Integer -> JStgExpr
Int Integer
0xFF)
mask16 :: JStgExpr -> JStgExpr
mask16 :: JStgExpr -> JStgExpr
mask16 JStgExpr
x = JStgExpr -> JStgExpr -> JStgExpr
BAnd JStgExpr
x (Integer -> JStgExpr
Int Integer
0xFFFF)
signExtend8 :: JStgExpr -> JStgExpr
signExtend8 :: JStgExpr -> JStgExpr
signExtend8 JStgExpr
x = (JStgExpr -> JStgExpr -> JStgExpr
BAnd JStgExpr
x (Integer -> JStgExpr
Int Integer
0x7F )) JStgExpr -> JStgExpr -> JStgExpr
`Sub` (JStgExpr -> JStgExpr -> JStgExpr
BAnd JStgExpr
x (Integer -> JStgExpr
Int Integer
0x80))
signExtend16 :: JStgExpr -> JStgExpr
signExtend16 :: JStgExpr -> JStgExpr
signExtend16 JStgExpr
x = (JStgExpr -> JStgExpr -> JStgExpr
BAnd JStgExpr
x (Integer -> JStgExpr
Int Integer
0x7FFF)) JStgExpr -> JStgExpr -> JStgExpr
`Sub` (JStgExpr -> JStgExpr -> JStgExpr
BAnd JStgExpr
x (Integer -> JStgExpr
Int Integer
0x8000))
(.^) :: JStgExpr -> FastString -> JStgExpr
JStgExpr
obj .^ :: JStgExpr -> FastString -> JStgExpr
.^ FastString
prop = JStgExpr -> Ident -> JStgExpr
SelExpr JStgExpr
obj (FastString -> Ident
name FastString
prop)
infixl 8 .^
(|=) :: JStgExpr -> JStgExpr -> JStgStat
|= :: JStgExpr -> JStgExpr -> JStgStat
(|=) JStgExpr
l JStgExpr
r = JStgExpr -> AOp -> JStgExpr -> JStgStat
AssignStat JStgExpr
l AOp
AssignOp JStgExpr
r
(||=) :: Ident -> JStgExpr -> JStgStat
Ident
i ||= :: Ident -> JStgExpr -> JStgStat
||= JStgExpr
ex = Ident -> Maybe JStgExpr -> JStgStat
DeclStat Ident
i (JStgExpr -> Maybe JStgExpr
forall a. a -> Maybe a
Just JStgExpr
ex)
infixl 2 ||=, |=
(.!) :: JStgExpr -> JStgExpr -> JStgExpr
.! :: JStgExpr -> JStgExpr -> JStgExpr
(.!) = JStgExpr -> JStgExpr -> JStgExpr
IdxExpr
infixl 8 .!
assignAllEqual :: HasDebugCallStack => [JStgExpr] -> [JStgExpr] -> JStgStat
assignAllEqual :: HasDebugCallStack => [JStgExpr] -> [JStgExpr] -> JStgStat
assignAllEqual [JStgExpr]
xs [JStgExpr]
ys = [JStgStat] -> JStgStat
forall a. Monoid a => [a] -> a
mconcat (String
-> (JStgExpr -> JStgExpr -> JStgStat)
-> [JStgExpr]
-> [JStgExpr]
-> [JStgStat]
forall a b c.
HasDebugCallStack =>
String -> (a -> b -> c) -> [a] -> [b] -> [c]
zipWithEqual String
"assignAllEqual" JStgExpr -> JStgExpr -> JStgStat
(|=) [JStgExpr]
xs [JStgExpr]
ys)
assignAll :: [JStgExpr] -> [JStgExpr] -> JStgStat
assignAll :: [JStgExpr] -> [JStgExpr] -> JStgStat
assignAll [JStgExpr]
xs [JStgExpr]
ys = [JStgStat] -> JStgStat
forall a. Monoid a => [a] -> a
mconcat ((JStgExpr -> JStgExpr -> JStgStat)
-> [JStgExpr] -> [JStgExpr] -> [JStgStat]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith JStgExpr -> JStgExpr -> JStgStat
(|=) [JStgExpr]
xs [JStgExpr]
ys)
assignAllReverseOrder :: [JStgExpr] -> [JStgExpr] -> JStgStat
assignAllReverseOrder :: [JStgExpr] -> [JStgExpr] -> JStgStat
assignAllReverseOrder [JStgExpr]
xs [JStgExpr]
ys = [JStgStat] -> JStgStat
forall a. Monoid a => [a] -> a
mconcat ([JStgStat] -> [JStgStat]
forall a. [a] -> [a]
reverse ((JStgExpr -> JStgExpr -> JStgStat)
-> [JStgExpr] -> [JStgExpr] -> [JStgStat]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith JStgExpr -> JStgExpr -> JStgStat
(|=) [JStgExpr]
xs [JStgExpr]
ys))
declAssignAll :: [Ident] -> [JStgExpr] -> JStgStat
declAssignAll :: [Ident] -> [JStgExpr] -> JStgStat
declAssignAll [Ident]
xs [JStgExpr]
ys = [JStgStat] -> JStgStat
forall a. Monoid a => [a] -> a
mconcat ((Ident -> JStgExpr -> JStgStat)
-> [Ident] -> [JStgExpr] -> [JStgStat]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Ident -> JStgExpr -> JStgStat
(||=) [Ident]
xs [JStgExpr]
ys)
null_ :: JStgExpr
null_ :: JStgExpr
null_ = FastString -> JStgExpr
global FastString
"null"
zero_ :: JStgExpr
zero_ :: JStgExpr
zero_ = Integer -> JStgExpr
Int Integer
0
one_ :: JStgExpr
one_ :: JStgExpr
one_ = Integer -> JStgExpr
Int Integer
1
two_ :: JStgExpr
two_ :: JStgExpr
two_ = Integer -> JStgExpr
Int Integer
2
three_ :: JStgExpr
three_ :: JStgExpr
three_ = Integer -> JStgExpr
Int Integer
3
undefined_ :: JStgExpr
undefined_ :: JStgExpr
undefined_ = FastString -> JStgExpr
global FastString
"undefined"
true_ :: JStgExpr
true_ :: JStgExpr
true_ = JVal -> JStgExpr
ValExpr (Bool -> JVal
JBool Bool
True)
false_ :: JStgExpr
false_ :: JStgExpr
false_ = JVal -> JStgExpr
ValExpr (Bool -> JVal
JBool Bool
False)
returnStack :: JStgStat
returnStack :: JStgStat
returnStack = JStgExpr -> JStgStat
ReturnStat (JStgExpr -> [JStgExpr] -> JStgExpr
ApplExpr (FastString -> JStgExpr
global FastString
"h$rs") [])
math :: JStgExpr
math :: JStgExpr
math = FastString -> JStgExpr
global FastString
"Math"
math_ :: FastString -> [JStgExpr] -> JStgExpr
math_ :: FastString -> [JStgExpr] -> JStgExpr
math_ FastString
op [JStgExpr]
args = JStgExpr -> [JStgExpr] -> JStgExpr
ApplExpr (JStgExpr
math JStgExpr -> FastString -> JStgExpr
.^ FastString
op) [JStgExpr]
args
math_log, math_sin, math_cos, math_tan, math_exp, math_acos, math_asin, math_atan,
math_abs, math_pow, math_sqrt, math_asinh, math_acosh, math_atanh, math_sign,
math_sinh, math_cosh, math_tanh, math_expm1, math_log1p, math_fround,
math_min, math_max
:: [JStgExpr] -> JStgExpr
math_log :: [JStgExpr] -> JStgExpr
math_log = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"log"
math_sin :: [JStgExpr] -> JStgExpr
math_sin = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"sin"
math_cos :: [JStgExpr] -> JStgExpr
math_cos = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"cos"
math_tan :: [JStgExpr] -> JStgExpr
math_tan = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"tan"
math_exp :: [JStgExpr] -> JStgExpr
math_exp = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"exp"
math_acos :: [JStgExpr] -> JStgExpr
math_acos = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"acos"
math_asin :: [JStgExpr] -> JStgExpr
math_asin = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"asin"
math_atan :: [JStgExpr] -> JStgExpr
math_atan = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"atan"
math_abs :: [JStgExpr] -> JStgExpr
math_abs = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"abs"
math_pow :: [JStgExpr] -> JStgExpr
math_pow = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"pow"
math_sign :: [JStgExpr] -> JStgExpr
math_sign = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"sign"
math_sqrt :: [JStgExpr] -> JStgExpr
math_sqrt = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"sqrt"
math_asinh :: [JStgExpr] -> JStgExpr
math_asinh = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"asinh"
math_acosh :: [JStgExpr] -> JStgExpr
math_acosh = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"acosh"
math_atanh :: [JStgExpr] -> JStgExpr
math_atanh = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"atanh"
math_sinh :: [JStgExpr] -> JStgExpr
math_sinh = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"sinh"
math_cosh :: [JStgExpr] -> JStgExpr
math_cosh = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"cosh"
math_tanh :: [JStgExpr] -> JStgExpr
math_tanh = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"tanh"
math_expm1 :: [JStgExpr] -> JStgExpr
math_expm1 = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"expm1"
math_log1p :: [JStgExpr] -> JStgExpr
math_log1p = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"log1p"
math_fround :: [JStgExpr] -> JStgExpr
math_fround = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"fround"
math_min :: [JStgExpr] -> JStgExpr
math_min = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"min"
math_max :: [JStgExpr] -> JStgExpr
math_max = FastString -> [JStgExpr] -> JStgExpr
math_ FastString
"max"
instance Num JStgExpr where
JStgExpr
x + :: JStgExpr -> JStgExpr -> JStgExpr
+ JStgExpr
y = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
AddOp JStgExpr
x JStgExpr
y
JStgExpr
x - :: JStgExpr -> JStgExpr -> JStgExpr
- JStgExpr
y = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
SubOp JStgExpr
x JStgExpr
y
JStgExpr
x * :: JStgExpr -> JStgExpr -> JStgExpr
* JStgExpr
y = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
MulOp JStgExpr
x JStgExpr
y
abs :: JStgExpr -> JStgExpr
abs JStgExpr
x = [JStgExpr] -> JStgExpr
math_abs [JStgExpr
x]
negate :: JStgExpr -> JStgExpr
negate JStgExpr
x = UOp -> JStgExpr -> JStgExpr
UOpExpr UOp
NegOp JStgExpr
x
signum :: JStgExpr -> JStgExpr
signum JStgExpr
x = [JStgExpr] -> JStgExpr
math_sign [JStgExpr
x]
fromInteger :: Integer -> JStgExpr
fromInteger Integer
x = JVal -> JStgExpr
ValExpr (Integer -> JVal
JInt Integer
x)
instance Fractional JStgExpr where
JStgExpr
x / :: JStgExpr -> JStgExpr -> JStgExpr
/ JStgExpr
y = Op -> JStgExpr -> JStgExpr -> JStgExpr
InfixExpr Op
DivOp JStgExpr
x JStgExpr
y
fromRational :: Rational -> JStgExpr
fromRational Rational
x = JVal -> JStgExpr
ValExpr (SaneDouble -> JVal
JDouble (Rational -> SaneDouble
forall a b. (Real a, Fractional b) => a -> b
realToFrac Rational
x))
#if __GLASGOW_HASKELL__ < 905
pattern MkSolo :: a -> Solo a
pattern MkSolo a = Solo a
{-# COMPLETE MkSolo #-}
#endif
class JVarMagic a where
fresh :: JSM a
class JSArgument args where
argList :: args -> [Ident]
args :: JSM args
instance JVarMagic Ident where
fresh :: StateT JEnv Identity Ident
fresh = StateT JEnv Identity Ident
newIdent
instance JVarMagic JVal where
fresh :: JSM JVal
fresh = Ident -> JVal
JVar (Ident -> JVal) -> StateT JEnv Identity Ident -> JSM JVal
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT JEnv Identity Ident
forall a. JVarMagic a => JSM a
fresh
instance JVarMagic JStgExpr where
fresh :: JSM JStgExpr
fresh = do i <- StateT JEnv Identity Ident
forall a. JVarMagic a => JSM a
fresh
return $ ValExpr $ JVar i
instance (JVarMagic a, ToJExpr a) => JSArgument (Solo a) where
argList :: Solo a -> [Ident]
argList (MkSolo a
a) = (JStgExpr -> [Ident]) -> [JStgExpr] -> [Ident]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap JStgExpr -> [Ident]
identsE [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a]
args :: JSM (Solo a)
args = do i <- JSM a
forall a. JVarMagic a => JSM a
fresh
return $ MkSolo i
instance (JVarMagic a, JVarMagic b, ToJExpr a, ToJExpr b) => JSArgument (a,b) where
argList :: (a, b) -> [Ident]
argList (a
a,b
b) = (JStgExpr -> [Ident]) -> [JStgExpr] -> [Ident]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap JStgExpr -> [Ident]
identsE [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a , b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b]
args :: JSM (a, b)
args = (,) (a -> b -> (a, b))
-> StateT JEnv Identity a -> StateT JEnv Identity (b -> (a, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT JEnv Identity a
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (b -> (a, b))
-> StateT JEnv Identity b -> JSM (a, b)
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity b
forall a. JVarMagic a => JSM a
fresh
instance ( JVarMagic a, ToJExpr a
, JVarMagic b, ToJExpr b
, JVarMagic c, ToJExpr c
) => JSArgument (a,b,c) where
argList :: (a, b, c) -> [Ident]
argList (a
a,b
b,c
c) = (JStgExpr -> [Ident]) -> [JStgExpr] -> [Ident]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap JStgExpr -> [Ident]
identsE [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a , b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b, c -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr c
c]
args :: JSM (a, b, c)
args = (,,) (a -> b -> c -> (a, b, c))
-> StateT JEnv Identity a
-> StateT JEnv Identity (b -> c -> (a, b, c))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT JEnv Identity a
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (b -> c -> (a, b, c))
-> StateT JEnv Identity b -> StateT JEnv Identity (c -> (a, b, c))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity b
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (c -> (a, b, c))
-> StateT JEnv Identity c -> JSM (a, b, c)
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity c
forall a. JVarMagic a => JSM a
fresh
instance ( JVarMagic a, ToJExpr a
, JVarMagic b, ToJExpr b
, JVarMagic c, ToJExpr c
, JVarMagic d, ToJExpr d
) => JSArgument (a,b,c,d) where
argList :: (a, b, c, d) -> [Ident]
argList (a
a,b
b,c
c,d
d) = (JStgExpr -> [Ident]) -> [JStgExpr] -> [Ident]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap JStgExpr -> [Ident]
identsE [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a , b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b, c -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr c
c, d -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr d
d]
args :: JSM (a, b, c, d)
args = (,,,) (a -> b -> c -> d -> (a, b, c, d))
-> StateT JEnv Identity a
-> StateT JEnv Identity (b -> c -> d -> (a, b, c, d))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT JEnv Identity a
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (b -> c -> d -> (a, b, c, d))
-> StateT JEnv Identity b
-> StateT JEnv Identity (c -> d -> (a, b, c, d))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity b
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (c -> d -> (a, b, c, d))
-> StateT JEnv Identity c
-> StateT JEnv Identity (d -> (a, b, c, d))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity c
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (d -> (a, b, c, d))
-> StateT JEnv Identity d -> JSM (a, b, c, d)
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity d
forall a. JVarMagic a => JSM a
fresh
instance ( JVarMagic a, ToJExpr a
, JVarMagic b, ToJExpr b
, JVarMagic c, ToJExpr c
, JVarMagic d, ToJExpr d
, JVarMagic e, ToJExpr e
) => JSArgument (a,b,c,d,e) where
argList :: (a, b, c, d, e) -> [Ident]
argList (a
a,b
b,c
c,d
d,e
e) = (JStgExpr -> [Ident]) -> [JStgExpr] -> [Ident]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap JStgExpr -> [Ident]
identsE [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a , b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b, c -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr c
c, d -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr d
d, e -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr e
e]
args :: JSM (a, b, c, d, e)
args = (,,,,) (a -> b -> c -> d -> e -> (a, b, c, d, e))
-> StateT JEnv Identity a
-> StateT JEnv Identity (b -> c -> d -> e -> (a, b, c, d, e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT JEnv Identity a
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (b -> c -> d -> e -> (a, b, c, d, e))
-> StateT JEnv Identity b
-> StateT JEnv Identity (c -> d -> e -> (a, b, c, d, e))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity b
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (c -> d -> e -> (a, b, c, d, e))
-> StateT JEnv Identity c
-> StateT JEnv Identity (d -> e -> (a, b, c, d, e))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity c
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (d -> e -> (a, b, c, d, e))
-> StateT JEnv Identity d
-> StateT JEnv Identity (e -> (a, b, c, d, e))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity d
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (e -> (a, b, c, d, e))
-> StateT JEnv Identity e -> JSM (a, b, c, d, e)
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity e
forall a. JVarMagic a => JSM a
fresh
instance ( JVarMagic a, ToJExpr a
, JVarMagic b, ToJExpr b
, JVarMagic c, ToJExpr c
, JVarMagic d, ToJExpr d
, JVarMagic e, ToJExpr e
, JVarMagic f, ToJExpr f
) => JSArgument (a,b,c,d,e,f) where
argList :: (a, b, c, d, e, f) -> [Ident]
argList (a
a,b
b,c
c,d
d,e
e,f
f) = (JStgExpr -> [Ident]) -> [JStgExpr] -> [Ident]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap JStgExpr -> [Ident]
identsE [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a , b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b, c -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr c
c, d -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr d
d, e -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr e
e, f -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr f
f]
args :: JSM (a, b, c, d, e, f)
args = (,,,,,) (a -> b -> c -> d -> e -> f -> (a, b, c, d, e, f))
-> StateT JEnv Identity a
-> StateT
JEnv Identity (b -> c -> d -> e -> f -> (a, b, c, d, e, f))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT JEnv Identity a
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (b -> c -> d -> e -> f -> (a, b, c, d, e, f))
-> StateT JEnv Identity b
-> StateT JEnv Identity (c -> d -> e -> f -> (a, b, c, d, e, f))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity b
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (c -> d -> e -> f -> (a, b, c, d, e, f))
-> StateT JEnv Identity c
-> StateT JEnv Identity (d -> e -> f -> (a, b, c, d, e, f))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity c
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (d -> e -> f -> (a, b, c, d, e, f))
-> StateT JEnv Identity d
-> StateT JEnv Identity (e -> f -> (a, b, c, d, e, f))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity d
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (e -> f -> (a, b, c, d, e, f))
-> StateT JEnv Identity e
-> StateT JEnv Identity (f -> (a, b, c, d, e, f))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity e
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (f -> (a, b, c, d, e, f))
-> StateT JEnv Identity f -> JSM (a, b, c, d, e, f)
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity f
forall a. JVarMagic a => JSM a
fresh
instance ( JVarMagic a, ToJExpr a
, JVarMagic b, ToJExpr b
, JVarMagic c, ToJExpr c
, JVarMagic d, ToJExpr d
, JVarMagic e, ToJExpr e
, JVarMagic f, ToJExpr f
, JVarMagic g, ToJExpr g
) => JSArgument (a,b,c,d,e,f,g) where
argList :: (a, b, c, d, e, f, g) -> [Ident]
argList (a
a,b
b,c
c,d
d,e
e,f
f,g
g) = (JStgExpr -> [Ident]) -> [JStgExpr] -> [Ident]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap JStgExpr -> [Ident]
identsE [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a , b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b, c -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr c
c, d -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr d
d, e -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr e
e, f -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr f
f, g -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr g
g]
args :: JSM (a, b, c, d, e, f, g)
args = (,,,,,,) (a -> b -> c -> d -> e -> f -> g -> (a, b, c, d, e, f, g))
-> StateT JEnv Identity a
-> StateT
JEnv Identity (b -> c -> d -> e -> f -> g -> (a, b, c, d, e, f, g))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT JEnv Identity a
forall a. JVarMagic a => JSM a
fresh StateT
JEnv Identity (b -> c -> d -> e -> f -> g -> (a, b, c, d, e, f, g))
-> StateT JEnv Identity b
-> StateT
JEnv Identity (c -> d -> e -> f -> g -> (a, b, c, d, e, f, g))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity b
forall a. JVarMagic a => JSM a
fresh StateT
JEnv Identity (c -> d -> e -> f -> g -> (a, b, c, d, e, f, g))
-> StateT JEnv Identity c
-> StateT JEnv Identity (d -> e -> f -> g -> (a, b, c, d, e, f, g))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity c
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (d -> e -> f -> g -> (a, b, c, d, e, f, g))
-> StateT JEnv Identity d
-> StateT JEnv Identity (e -> f -> g -> (a, b, c, d, e, f, g))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity d
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (e -> f -> g -> (a, b, c, d, e, f, g))
-> StateT JEnv Identity e
-> StateT JEnv Identity (f -> g -> (a, b, c, d, e, f, g))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity e
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (f -> g -> (a, b, c, d, e, f, g))
-> StateT JEnv Identity f
-> StateT JEnv Identity (g -> (a, b, c, d, e, f, g))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity f
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (g -> (a, b, c, d, e, f, g))
-> StateT JEnv Identity g -> JSM (a, b, c, d, e, f, g)
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity g
forall a. JVarMagic a => JSM a
fresh
instance ( JVarMagic a, ToJExpr a
, JVarMagic b, ToJExpr b
, JVarMagic c, ToJExpr c
, JVarMagic d, ToJExpr d
, JVarMagic e, ToJExpr e
, JVarMagic f, ToJExpr f
, JVarMagic g, ToJExpr g
, JVarMagic h, ToJExpr h
) => JSArgument (a,b,c,d,e,f,g,h) where
argList :: (a, b, c, d, e, f, g, h) -> [Ident]
argList (a
a,b
b,c
c,d
d,e
e,f
f,g
g,h
h) = (JStgExpr -> [Ident]) -> [JStgExpr] -> [Ident]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap JStgExpr -> [Ident]
identsE [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a , b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b, c -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr c
c, d -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr d
d, e -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr e
e, f -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr f
f, g -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr g
g, h -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr h
h]
args :: JSM (a, b, c, d, e, f, g, h)
args = (,,,,,,,) (a -> b -> c -> d -> e -> f -> g -> h -> (a, b, c, d, e, f, g, h))
-> StateT JEnv Identity a
-> StateT
JEnv
Identity
(b -> c -> d -> e -> f -> g -> h -> (a, b, c, d, e, f, g, h))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT JEnv Identity a
forall a. JVarMagic a => JSM a
fresh StateT
JEnv
Identity
(b -> c -> d -> e -> f -> g -> h -> (a, b, c, d, e, f, g, h))
-> StateT JEnv Identity b
-> StateT
JEnv
Identity
(c -> d -> e -> f -> g -> h -> (a, b, c, d, e, f, g, h))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity b
forall a. JVarMagic a => JSM a
fresh StateT
JEnv
Identity
(c -> d -> e -> f -> g -> h -> (a, b, c, d, e, f, g, h))
-> StateT JEnv Identity c
-> StateT
JEnv Identity (d -> e -> f -> g -> h -> (a, b, c, d, e, f, g, h))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity c
forall a. JVarMagic a => JSM a
fresh StateT
JEnv Identity (d -> e -> f -> g -> h -> (a, b, c, d, e, f, g, h))
-> StateT JEnv Identity d
-> StateT
JEnv Identity (e -> f -> g -> h -> (a, b, c, d, e, f, g, h))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity d
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (e -> f -> g -> h -> (a, b, c, d, e, f, g, h))
-> StateT JEnv Identity e
-> StateT JEnv Identity (f -> g -> h -> (a, b, c, d, e, f, g, h))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity e
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (f -> g -> h -> (a, b, c, d, e, f, g, h))
-> StateT JEnv Identity f
-> StateT JEnv Identity (g -> h -> (a, b, c, d, e, f, g, h))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity f
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (g -> h -> (a, b, c, d, e, f, g, h))
-> StateT JEnv Identity g
-> StateT JEnv Identity (h -> (a, b, c, d, e, f, g, h))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity g
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (h -> (a, b, c, d, e, f, g, h))
-> StateT JEnv Identity h -> JSM (a, b, c, d, e, f, g, h)
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity h
forall a. JVarMagic a => JSM a
fresh
instance ( JVarMagic a, ToJExpr a
, JVarMagic b, ToJExpr b
, JVarMagic c, ToJExpr c
, JVarMagic d, ToJExpr d
, JVarMagic e, ToJExpr e
, JVarMagic f, ToJExpr f
, JVarMagic g, ToJExpr g
, JVarMagic h, ToJExpr h
, JVarMagic i, ToJExpr i
) => JSArgument (a,b,c,d,e,f,g,h,i) where
argList :: (a, b, c, d, e, f, g, h, i) -> [Ident]
argList (a
a,b
b,c
c,d
d,e
e,f
f,g
g,h
h,i
i) = (JStgExpr -> [Ident]) -> [JStgExpr] -> [Ident]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap JStgExpr -> [Ident]
identsE [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a , b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b, c -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr c
c, d -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr d
d, e -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr e
e, f -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr f
f, g -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr g
g, h -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr h
h, i -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr i
i]
args :: JSM (a, b, c, d, e, f, g, h, i)
args = (,,,,,,,,) (a
-> b
-> c
-> d
-> e
-> f
-> g
-> h
-> i
-> (a, b, c, d, e, f, g, h, i))
-> StateT JEnv Identity a
-> StateT
JEnv
Identity
(b
-> c -> d -> e -> f -> g -> h -> i -> (a, b, c, d, e, f, g, h, i))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT JEnv Identity a
forall a. JVarMagic a => JSM a
fresh StateT
JEnv
Identity
(b
-> c -> d -> e -> f -> g -> h -> i -> (a, b, c, d, e, f, g, h, i))
-> StateT JEnv Identity b
-> StateT
JEnv
Identity
(c -> d -> e -> f -> g -> h -> i -> (a, b, c, d, e, f, g, h, i))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity b
forall a. JVarMagic a => JSM a
fresh StateT
JEnv
Identity
(c -> d -> e -> f -> g -> h -> i -> (a, b, c, d, e, f, g, h, i))
-> StateT JEnv Identity c
-> StateT
JEnv
Identity
(d -> e -> f -> g -> h -> i -> (a, b, c, d, e, f, g, h, i))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity c
forall a. JVarMagic a => JSM a
fresh StateT
JEnv
Identity
(d -> e -> f -> g -> h -> i -> (a, b, c, d, e, f, g, h, i))
-> StateT JEnv Identity d
-> StateT
JEnv
Identity
(e -> f -> g -> h -> i -> (a, b, c, d, e, f, g, h, i))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity d
forall a. JVarMagic a => JSM a
fresh StateT
JEnv
Identity
(e -> f -> g -> h -> i -> (a, b, c, d, e, f, g, h, i))
-> StateT JEnv Identity e
-> StateT
JEnv Identity (f -> g -> h -> i -> (a, b, c, d, e, f, g, h, i))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity e
forall a. JVarMagic a => JSM a
fresh StateT
JEnv Identity (f -> g -> h -> i -> (a, b, c, d, e, f, g, h, i))
-> StateT JEnv Identity f
-> StateT
JEnv Identity (g -> h -> i -> (a, b, c, d, e, f, g, h, i))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity f
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (g -> h -> i -> (a, b, c, d, e, f, g, h, i))
-> StateT JEnv Identity g
-> StateT JEnv Identity (h -> i -> (a, b, c, d, e, f, g, h, i))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity g
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (h -> i -> (a, b, c, d, e, f, g, h, i))
-> StateT JEnv Identity h
-> StateT JEnv Identity (i -> (a, b, c, d, e, f, g, h, i))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity h
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (i -> (a, b, c, d, e, f, g, h, i))
-> StateT JEnv Identity i -> JSM (a, b, c, d, e, f, g, h, i)
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity i
forall a. JVarMagic a => JSM a
fresh
instance ( JVarMagic a, ToJExpr a
, JVarMagic b, ToJExpr b
, JVarMagic c, ToJExpr c
, JVarMagic d, ToJExpr d
, JVarMagic e, ToJExpr e
, JVarMagic f, ToJExpr f
, JVarMagic g, ToJExpr g
, JVarMagic h, ToJExpr h
, JVarMagic i, ToJExpr i
, JVarMagic j, ToJExpr j
) => JSArgument (a,b,c,d,e,f,g,h,i,j) where
argList :: (a, b, c, d, e, f, g, h, i, j) -> [Ident]
argList (a
a,b
b,c
c,d
d,e
e,f
f,g
g,h
h,i
i,j
j) = (JStgExpr -> [Ident]) -> [JStgExpr] -> [Ident]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap JStgExpr -> [Ident]
identsE [a -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr a
a , b -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr b
b, c -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr c
c, d -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr d
d, e -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr e
e, f -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr f
f, g -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr g
g, h -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr h
h, i -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr i
i, j -> JStgExpr
forall a. ToJExpr a => a -> JStgExpr
toJExpr j
j]
args :: JSM (a, b, c, d, e, f, g, h, i, j)
args = (,,,,,,,,,) (a
-> b
-> c
-> d
-> e
-> f
-> g
-> h
-> i
-> j
-> (a, b, c, d, e, f, g, h, i, j))
-> StateT JEnv Identity a
-> StateT
JEnv
Identity
(b
-> c
-> d
-> e
-> f
-> g
-> h
-> i
-> j
-> (a, b, c, d, e, f, g, h, i, j))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT JEnv Identity a
forall a. JVarMagic a => JSM a
fresh StateT
JEnv
Identity
(b
-> c
-> d
-> e
-> f
-> g
-> h
-> i
-> j
-> (a, b, c, d, e, f, g, h, i, j))
-> StateT JEnv Identity b
-> StateT
JEnv
Identity
(c
-> d
-> e
-> f
-> g
-> h
-> i
-> j
-> (a, b, c, d, e, f, g, h, i, j))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity b
forall a. JVarMagic a => JSM a
fresh StateT
JEnv
Identity
(c
-> d
-> e
-> f
-> g
-> h
-> i
-> j
-> (a, b, c, d, e, f, g, h, i, j))
-> StateT JEnv Identity c
-> StateT
JEnv
Identity
(d -> e -> f -> g -> h -> i -> j -> (a, b, c, d, e, f, g, h, i, j))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity c
forall a. JVarMagic a => JSM a
fresh StateT
JEnv
Identity
(d -> e -> f -> g -> h -> i -> j -> (a, b, c, d, e, f, g, h, i, j))
-> StateT JEnv Identity d
-> StateT
JEnv
Identity
(e -> f -> g -> h -> i -> j -> (a, b, c, d, e, f, g, h, i, j))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity d
forall a. JVarMagic a => JSM a
fresh StateT
JEnv
Identity
(e -> f -> g -> h -> i -> j -> (a, b, c, d, e, f, g, h, i, j))
-> StateT JEnv Identity e
-> StateT
JEnv
Identity
(f -> g -> h -> i -> j -> (a, b, c, d, e, f, g, h, i, j))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity e
forall a. JVarMagic a => JSM a
fresh StateT
JEnv
Identity
(f -> g -> h -> i -> j -> (a, b, c, d, e, f, g, h, i, j))
-> StateT JEnv Identity f
-> StateT
JEnv Identity (g -> h -> i -> j -> (a, b, c, d, e, f, g, h, i, j))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity f
forall a. JVarMagic a => JSM a
fresh StateT
JEnv Identity (g -> h -> i -> j -> (a, b, c, d, e, f, g, h, i, j))
-> StateT JEnv Identity g
-> StateT
JEnv Identity (h -> i -> j -> (a, b, c, d, e, f, g, h, i, j))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity g
forall a. JVarMagic a => JSM a
fresh StateT
JEnv Identity (h -> i -> j -> (a, b, c, d, e, f, g, h, i, j))
-> StateT JEnv Identity h
-> StateT JEnv Identity (i -> j -> (a, b, c, d, e, f, g, h, i, j))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity h
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (i -> j -> (a, b, c, d, e, f, g, h, i, j))
-> StateT JEnv Identity i
-> StateT JEnv Identity (j -> (a, b, c, d, e, f, g, h, i, j))
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity i
forall a. JVarMagic a => JSM a
fresh StateT JEnv Identity (j -> (a, b, c, d, e, f, g, h, i, j))
-> StateT JEnv Identity j -> JSM (a, b, c, d, e, f, g, h, i, j)
forall a b.
StateT JEnv Identity (a -> b)
-> StateT JEnv Identity a -> StateT JEnv Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT JEnv Identity j
forall a. JVarMagic a => JSM a
fresh