{-#LANGUAGE FlexibleContexts #-}
{-#LANGUAGE FlexibleInstances #-}
{-#LANGUAGE OverloadedStrings #-}
{-#LANGUAGE TupleSections #-}
{-#LANGUAGE TypeSynonymInstances #-}
{-#LANGUAGE MultiParamTypeClasses #-}
{-#LANGUAGE ScopedTypeVariables #-}
{-#LANGUAGE LambdaCase #-}
module Text.Ginger.Run
(
easyRenderM
, easyRender
, easyContext
, runGingerT
, runGinger
, makeContext
, makeContextM
, makeContext'
, makeContextM'
, makeContextExM'
, makeContextHtml
, makeContextHtmlM
, makeContextHtmlExM
, makeContextText
, makeContextTextM
, makeContextTextExM
, GingerContext
, Run, liftRun, liftRun2
, extractArgs, extractArgsT, extractArgsL, extractArgsDefL
, hoistContext
, hoistRun
, hoistNewlines
, hoistRunState
, RuntimeError (..)
, runtimeErrorWhat
, runtimeErrorWhere
, runtimeErrorMessage
)
where
import Prelude ( (.), ($), (==), (/=)
, (>), (<), (>=), (<=)
, (+), (-), (*), (/), div, (**), (^)
, (||), (&&)
, (++)
, Show, show
, undefined, otherwise
, Maybe (..)
, Bool (..)
, Int, Integer, String
, fromIntegral, floor, round
, not
, show
, uncurry
, seq
, fst, snd
, maybe
, Either (..)
, id
)
import qualified Prelude
import Data.Maybe (fromMaybe, isJust, isNothing)
import qualified Data.List as List
import Text.Ginger.AST
import Text.Ginger.Html
import Text.Ginger.GVal
import Text.Ginger.Run.Type
import Text.Ginger.Run.Builtins
import Text.Ginger.Run.FuncUtils
import Text.Ginger.Run.VM
import Text.Printf
import Text.PrintfA
import Text.Ginger.Parse (parseGinger, ParserError)
import Control.Monad.Except (runExceptT, throwError, catchError)
import Data.Text (Text)
import Data.String (fromString)
import qualified Data.Text as Text
import qualified Data.ByteString.UTF8 as UTF8
import Control.Monad
import Control.Monad.Identity
import Control.Monad.Writer
import Control.Monad.Reader
import Control.Monad.State
import Control.Applicative
import qualified Data.HashMap.Strict as HashMap
import Data.HashMap.Strict (HashMap)
import qualified Data.Map.Strict as Map
import Data.Map.Strict (Map)
import Data.Scientific (Scientific, formatScientific)
import qualified Data.Scientific as Scientific
import Data.Default (def)
import Safe (readMay, lastDef, headMay)
import Network.HTTP.Types (urlEncode)
import Debug.Trace (trace)
import Data.List (lookup, zipWith, unzip)
import Data.Aeson as JSON
defaultScope :: forall m h p
. ( Monoid h
, Monad m
, ToGVal (Run p m h) h
, ToGVal (Run p m h) p
)
=> [(Text, GVal (Run p m h))]
defaultScope :: [(Text, GVal (Run p m h))]
defaultScope =
[ (Text
"raw", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnRawHtml)
, (Text
"abs", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> ((Scientific -> Scientific) -> Function (Run p m h))
-> (Scientific -> Scientific)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> (Scientific -> Scientific) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
Scientific
-> (Scientific -> Scientific)
-> [(Maybe Text, GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
unaryNumericFunc Scientific
0 ((Scientific -> Scientific) -> GVal (Run p m h))
-> (Scientific -> Scientific) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ Scientific -> Scientific
forall a. Num a => a -> a
Prelude.abs)
, (Text
"any", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnAny)
, (Text
"all", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnAll)
, (Text
"apply", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnApply)
, (Text
"capitalize", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> (([Text] -> Text) -> Function (Run p m h))
-> ([Text] -> Text)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Text] -> Text) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
([Text] -> Text)
-> [(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h))
variadicStringFunc (([Text] -> Text) -> GVal (Run p m h))
-> ([Text] -> Text) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ [Text] -> Text
forall a. Monoid a => [a] -> a
mconcat ([Text] -> Text) -> ([Text] -> [Text]) -> [Text] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text -> Text) -> [Text] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
Prelude.map Text -> Text
capitalize)
, (Text
"ceil", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> ((Scientific -> Scientific) -> Function (Run p m h))
-> (Scientific -> Scientific)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> (Scientific -> Scientific) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
Scientific
-> (Scientific -> Scientific)
-> [(Maybe Text, GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
unaryNumericFunc Scientific
0 ((Scientific -> Scientific) -> GVal (Run p m h))
-> (Scientific -> Scientific) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ Integer -> Scientific
forall a b. (Integral a, Num b) => a -> b
Prelude.fromIntegral (Integer -> Scientific)
-> (Scientific -> Integer) -> Scientific -> Scientific
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
Prelude.ceiling)
, (Text
"center", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnCenter)
, (Text
"compose", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnCompose)
, (Text
"concat", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnConcat)
, (Text
"contains", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnContains)
, (Text
"d", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnDefault)
, (Text
"date", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnDateFormat)
, (Text
"dateformat", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnDateFormat)
, (Text
"default", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnDefault)
, (Text
"dictsort", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnDictsort)
, (Text
"difference", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> (([Scientific] -> Scientific) -> Function (Run p m h))
-> ([Scientific] -> Scientific)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> ([Scientific] -> Scientific) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
Scientific
-> ([Scientific] -> Scientific)
-> [(Maybe Text, GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
variadicNumericFunc Scientific
0 (([Scientific] -> Scientific) -> GVal (Run p m h))
-> ([Scientific] -> Scientific) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ [Scientific] -> Scientific
forall a. Num a => [a] -> a
difference)
, (Text
"divisibleby", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnDivisibleBy)
, (Text
"e", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnEscape)
, (Text
"eq", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnEquals)
, (Text
"equals", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnEquals)
, (Text
"equalto", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnEquals)
, (Text
"escape", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnEscape)
, (Text
"eval", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) h p.
(Monad m, Monoid h, ToGVal (Run p m h) h, ToGVal (Run p m h) p) =>
Function (Run p m h)
gfnEval)
, (Text
"even", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnEven)
, (Text
"filesizeformat", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnFileSizeFormat)
, (Text
"filter", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnFilter)
, (Text
"floor", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> ((Scientific -> Scientific) -> Function (Run p m h))
-> (Scientific -> Scientific)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> (Scientific -> Scientific) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
Scientific
-> (Scientific -> Scientific)
-> [(Maybe Text, GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
unaryNumericFunc Scientific
0 ((Scientific -> Scientific) -> GVal (Run p m h))
-> (Scientific -> Scientific) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ Integer -> Scientific
forall a b. (Integral a, Num b) => a -> b
Prelude.fromIntegral (Integer -> Scientific)
-> (Scientific -> Integer) -> Scientific -> Scientific
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
Prelude.floor)
, (Text
"format", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnPrintf)
, (Text
"ge", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnGreaterEquals)
, (Text
"gt", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnGreater)
, (Text
"greater", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnGreater)
, (Text
"greaterthan", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnGreater)
, (Text
"greaterEquals", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnGreaterEquals)
, (Text
"int", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> ((GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h))
-> (GVal (Run p m h) -> GVal (Run p m h))
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h)
forall (m :: * -> *) h p.
Monad m =>
(GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h)
unaryFunc ((GVal (Run p m h) -> GVal (Run p m h)) -> GVal (Run p m h))
-> (GVal (Run p m h) -> GVal (Run p m h)) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ Maybe Int -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal (Maybe Int -> GVal (Run p m h))
-> (GVal (Run p m h) -> Maybe Int)
-> GVal (Run p m h)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Scientific -> Int) -> Maybe Scientific -> Maybe Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Scientific -> Int
forall a b. (RealFrac a, Integral b) => a -> b
Prelude.truncate :: Scientific -> Int) (Maybe Scientific -> Maybe Int)
-> (GVal (Run p m h) -> Maybe Scientific)
-> GVal (Run p m h)
-> Maybe Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GVal (Run p m h) -> Maybe Scientific
forall (m :: * -> *). GVal m -> Maybe Scientific
asNumber)
, (Text
"int_ratio", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> (([Scientific] -> Scientific) -> Function (Run p m h))
-> ([Scientific] -> Scientific)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> ([Scientific] -> Scientific) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
Scientific
-> ([Scientific] -> Scientific)
-> [(Maybe Text, GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
variadicNumericFunc Scientific
1 (([Scientific] -> Scientific) -> GVal (Run p m h))
-> ([Scientific] -> Scientific) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ Integer -> Scientific
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer -> Scientific)
-> ([Scientific] -> Integer) -> [Scientific] -> Scientific
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Integer] -> Integer
forall a. (Integral a, Num a) => [a] -> a
intRatio ([Integer] -> Integer)
-> ([Scientific] -> [Integer]) -> [Scientific] -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Scientific -> Integer) -> [Scientific] -> [Integer]
forall a b. (a -> b) -> [a] -> [b]
Prelude.map Scientific -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
Prelude.floor)
, (Text
"is_lt", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnLess)
, (Text
"iterable", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> ((GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h))
-> (GVal (Run p m h) -> GVal (Run p m h))
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h)
forall (m :: * -> *) h p.
Monad m =>
(GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h)
unaryFunc ((GVal (Run p m h) -> GVal (Run p m h)) -> GVal (Run p m h))
-> (GVal (Run p m h) -> GVal (Run p m h)) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ Bool -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal (Bool -> GVal (Run p m h))
-> (GVal (Run p m h) -> Bool)
-> GVal (Run p m h)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (\GVal (Run p m h)
x -> GVal (Run p m h) -> Bool
forall (m :: * -> *). GVal m -> Bool
isList GVal (Run p m h)
x Bool -> Bool -> Bool
|| GVal (Run p m h) -> Bool
forall (m :: * -> *). GVal m -> Bool
isDict GVal (Run p m h)
x))
, (Text
"json", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnJSON)
, (Text
"length", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnLength)
, (Text
"le", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnLessEquals)
, (Text
"less", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnLess)
, (Text
"lessthan", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnLess)
, (Text
"lessEquals", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnLessEquals)
, (Text
"lt", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnLess)
, (Text
"map", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) a.
(Monad m, MonadError (RuntimeError a) m) =>
Function m
gfnMap)
, (Text
"modulo", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> (([Scientific] -> Scientific) -> Function (Run p m h))
-> ([Scientific] -> Scientific)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> ([Scientific] -> Scientific) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
Scientific
-> ([Scientific] -> Scientific)
-> [(Maybe Text, GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
variadicNumericFunc Scientific
1 (([Scientific] -> Scientific) -> GVal (Run p m h))
-> ([Scientific] -> Scientific) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ Integer -> Scientific
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer -> Scientific)
-> ([Scientific] -> Integer) -> [Scientific] -> Scientific
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Integer] -> Integer
forall a. (Integral a, Num a) => [a] -> a
modulo ([Integer] -> Integer)
-> ([Scientific] -> [Integer]) -> [Scientific] -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Scientific -> Integer) -> [Scientific] -> [Integer]
forall a b. (a -> b) -> [a] -> [b]
Prelude.map Scientific -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
Prelude.floor)
, (Text
"ne", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnNEquals)
, (Text
"nequals", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnNEquals)
, (Text
"num", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> ((GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h))
-> (GVal (Run p m h) -> GVal (Run p m h))
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h)
forall (m :: * -> *) h p.
Monad m =>
(GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h)
unaryFunc ((GVal (Run p m h) -> GVal (Run p m h)) -> GVal (Run p m h))
-> (GVal (Run p m h) -> GVal (Run p m h)) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ Maybe Scientific -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal (Maybe Scientific -> GVal (Run p m h))
-> (GVal (Run p m h) -> Maybe Scientific)
-> GVal (Run p m h)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GVal (Run p m h) -> Maybe Scientific
forall (m :: * -> *). GVal m -> Maybe Scientific
asNumber)
, (Text
"odd", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnOdd)
, (Text
"partial", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnPartial)
, (Text
"printf", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnPrintf)
, (Text
"product", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> (([Scientific] -> Scientific) -> Function (Run p m h))
-> ([Scientific] -> Scientific)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> ([Scientific] -> Scientific) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
Scientific
-> ([Scientific] -> Scientific)
-> [(Maybe Text, GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
variadicNumericFunc Scientific
1 (([Scientific] -> Scientific) -> GVal (Run p m h))
-> ([Scientific] -> Scientific) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ [Scientific] -> Scientific
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
Prelude.product)
, (Text
"ratio", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> (([Scientific] -> Scientific) -> Function (Run p m h))
-> ([Scientific] -> Scientific)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> ([Scientific] -> Scientific) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
Scientific
-> ([Scientific] -> Scientific)
-> [(Maybe Text, GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
variadicNumericFunc Scientific
1 (([Scientific] -> Scientific) -> GVal (Run p m h))
-> ([Scientific] -> Scientific) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ Double -> Scientific
forall a. RealFloat a => a -> Scientific
Scientific.fromFloatDigits (Double -> Scientific)
-> ([Scientific] -> Double) -> [Scientific] -> Scientific
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Double] -> Double
forall a. (Show a, Fractional a, Num a) => [a] -> a
ratio ([Double] -> Double)
-> ([Scientific] -> [Double]) -> [Scientific] -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Scientific -> Double) -> [Scientific] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
Prelude.map Scientific -> Double
forall a. RealFloat a => Scientific -> a
Scientific.toRealFloat)
, (Text
"replace", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnReplace)
, (Text
"round", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> ((Scientific -> Scientific) -> Function (Run p m h))
-> (Scientific -> Scientific)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> (Scientific -> Scientific) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
Scientific
-> (Scientific -> Scientific)
-> [(Maybe Text, GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
unaryNumericFunc Scientific
0 ((Scientific -> Scientific) -> GVal (Run p m h))
-> (Scientific -> Scientific) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ Integer -> Scientific
forall a b. (Integral a, Num b) => a -> b
Prelude.fromIntegral (Integer -> Scientific)
-> (Scientific -> Integer) -> Scientific -> Scientific
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
Prelude.round)
, (Text
"show", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> ((GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h))
-> (GVal (Run p m h) -> GVal (Run p m h))
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h)
forall (m :: * -> *) h p.
Monad m =>
(GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h)
unaryFunc ((GVal (Run p m h) -> GVal (Run p m h)) -> GVal (Run p m h))
-> (GVal (Run p m h) -> GVal (Run p m h)) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ String -> GVal (Run p m h)
forall a. IsString a => String -> a
fromString (String -> GVal (Run p m h))
-> (GVal (Run p m h) -> String)
-> GVal (Run p m h)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GVal (Run p m h) -> String
forall a. Show a => a -> String
show)
, (Text
"slice", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnSlice)
, (Text
"sort", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall p (m :: * -> *) h. Monad m => Function (Run p m h)
gfnSort)
, (Text
"split", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnSplit)
, (Text
"str", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> ((GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h))
-> (GVal (Run p m h) -> GVal (Run p m h))
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h)
forall (m :: * -> *) h p.
Monad m =>
(GVal (Run p m h) -> GVal (Run p m h)) -> Function (Run p m h)
unaryFunc ((GVal (Run p m h) -> GVal (Run p m h)) -> GVal (Run p m h))
-> (GVal (Run p m h) -> GVal (Run p m h)) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ Text -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal (Text -> GVal (Run p m h))
-> (GVal (Run p m h) -> Text)
-> GVal (Run p m h)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GVal (Run p m h) -> Text
forall (m :: * -> *). GVal m -> Text
asText)
, (Text
"sum", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> (([Scientific] -> Scientific) -> Function (Run p m h))
-> ([Scientific] -> Scientific)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> ([Scientific] -> Scientific) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
Scientific
-> ([Scientific] -> Scientific)
-> [(Maybe Text, GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
variadicNumericFunc Scientific
0 (([Scientific] -> Scientific) -> GVal (Run p m h))
-> ([Scientific] -> Scientific) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ [Scientific] -> Scientific
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
Prelude.sum)
, (Text
"truncate", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> ((Scientific -> Scientific) -> Function (Run p m h))
-> (Scientific -> Scientific)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> (Scientific -> Scientific) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
Scientific
-> (Scientific -> Scientific)
-> [(Maybe Text, GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
unaryNumericFunc Scientific
0 ((Scientific -> Scientific) -> GVal (Run p m h))
-> (Scientific -> Scientific) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ Integer -> Scientific
forall a b. (Integral a, Num b) => a -> b
Prelude.fromIntegral (Integer -> Scientific)
-> (Scientific -> Integer) -> Scientific -> Scientific
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
Prelude.truncate)
, (Text
"urlencode", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnUrlEncode)
, (Text
"upper", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> (([Text] -> Text) -> Function (Run p m h))
-> ([Text] -> Text)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Text] -> Text) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
([Text] -> Text)
-> [(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h))
variadicStringFunc (([Text] -> Text) -> GVal (Run p m h))
-> ([Text] -> Text) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ [Text] -> Text
forall a. Monoid a => [a] -> a
mconcat ([Text] -> Text) -> ([Text] -> [Text]) -> [Text] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text -> Text) -> [Text] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
Prelude.map Text -> Text
Text.toUpper)
, (Text
"lower", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Function (Run p m h) -> GVal (Run p m h))
-> (([Text] -> Text) -> Function (Run p m h))
-> ([Text] -> Text)
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Text] -> Text) -> Function (Run p m h)
forall (m :: * -> *) p h.
Monad m =>
([Text] -> Text)
-> [(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h))
variadicStringFunc (([Text] -> Text) -> GVal (Run p m h))
-> ([Text] -> Text) -> GVal (Run p m h)
forall a b. (a -> b) -> a -> b
$ [Text] -> Text
forall a. Monoid a => [a] -> a
mconcat ([Text] -> Text) -> ([Text] -> [Text]) -> [Text] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text -> Text) -> [Text] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
Prelude.map Text -> Text
Text.toLower)
, (Text
"throw", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) h p.
(Monad m, Monoid h, ToGVal (Run p m h) h, ToGVal (Run p m h) p) =>
Function (Run p m h)
gfnThrow)
, (Text
"zip", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnZip)
, (Text
"zipwith", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *) p h. Monad m => Function (Run p m h)
gfnZipWith)
, (Text
"in", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnIn)
, (Text
"escaped", Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall (m :: * -> *). Monad m => Function m
gfnEscaped)
, (Text
"regex", GVal (Run p m h)
forall (m :: * -> *) p h. Monad m => GVal (Run p m h)
gfoRegex)
]
easyRenderM :: ( Monad m
, ContextEncodable h
, Monoid h
, ToGVal (Run p m h) v
, ToGVal (Run p m h) h
, ToGVal (Run p m h) p
)
=> (h -> m ())
-> v
-> Template p
-> m (Either (RuntimeError p) (GVal (Run p m h)))
easyRenderM :: (h -> m ())
-> v
-> Template p
-> m (Either (RuntimeError p) (GVal (Run p m h)))
easyRenderM h -> m ()
emit v
context Template p
template =
GingerContext p m h
-> Template p -> m (Either (RuntimeError p) (GVal (Run p m h)))
forall p (m :: * -> *) h.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
GingerContext p m h
-> Template p -> m (Either (RuntimeError p) (GVal (Run p m h)))
runGingerT ((h -> m ()) -> v -> GingerContext p m h
forall (m :: * -> *) h p v.
(Monad m, ContextEncodable h, ToGVal (Run p m h) v) =>
(h -> m ()) -> v -> GingerContext p m h
easyContext h -> m ()
emit v
context) Template p
template
easyRender :: ( ContextEncodable h
, Monoid h
, ToGVal (Run p (Writer h) h) v
, ToGVal (Run p (Writer h) h) h
, ToGVal (Run p (Writer h) h) p
)
=> v
-> Template p
-> h
easyRender :: v -> Template p -> h
easyRender v
context Template p
template =
Writer
h (Either (RuntimeError p) (GVal (Run p (WriterT h Identity) h)))
-> h
forall w a. Writer w a -> w
execWriter (Writer
h (Either (RuntimeError p) (GVal (Run p (WriterT h Identity) h)))
-> h)
-> Writer
h (Either (RuntimeError p) (GVal (Run p (WriterT h Identity) h)))
-> h
forall a b. (a -> b) -> a -> b
$ (h -> WriterT h Identity ())
-> v
-> Template p
-> Writer
h (Either (RuntimeError p) (GVal (Run p (WriterT h Identity) h)))
forall (m :: * -> *) h p v.
(Monad m, ContextEncodable h, Monoid h, ToGVal (Run p m h) v,
ToGVal (Run p m h) h, ToGVal (Run p m h) p) =>
(h -> m ())
-> v
-> Template p
-> m (Either (RuntimeError p) (GVal (Run p m h)))
easyRenderM h -> WriterT h Identity ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell v
context Template p
template
runGinger :: ( ToGVal (Run p (Writer h) h) h
, ToGVal (Run p (Writer h) h) p
, Monoid h
)
=> GingerContext p (Writer h) h
-> Template p
-> h
runGinger :: GingerContext p (Writer h) h -> Template p -> h
runGinger GingerContext p (Writer h) h
context Template p
template =
Writer h (Either (RuntimeError p) (GVal (Run p (Writer h) h))) -> h
forall w a. Writer w a -> w
execWriter (Writer h (Either (RuntimeError p) (GVal (Run p (Writer h) h)))
-> h)
-> Writer h (Either (RuntimeError p) (GVal (Run p (Writer h) h)))
-> h
forall a b. (a -> b) -> a -> b
$ GingerContext p (Writer h) h
-> Template p
-> Writer h (Either (RuntimeError p) (GVal (Run p (Writer h) h)))
forall p (m :: * -> *) h.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
GingerContext p m h
-> Template p -> m (Either (RuntimeError p) (GVal (Run p m h)))
runGingerT GingerContext p (Writer h) h
context Template p
template
runGingerT :: ( ToGVal (Run p m h) h
, ToGVal (Run p m h) p
, Monoid h
, Monad m
)
=> GingerContext p m h
-> Template p
-> m (Either (RuntimeError p) (GVal (Run p m h)))
runGingerT :: GingerContext p m h
-> Template p -> m (Either (RuntimeError p) (GVal (Run p m h)))
runGingerT GingerContext p m h
context Template p
tpl =
ReaderT
(GingerContext p m h)
m
(Either (RuntimeError p) (GVal (Run p m h)))
-> GingerContext p m h
-> m (Either (RuntimeError p) (GVal (Run p m h)))
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (StateT
(RunState p m h)
(ReaderT (GingerContext p m h) m)
(Either (RuntimeError p) (GVal (Run p m h)))
-> RunState p m h
-> ReaderT
(GingerContext p m h)
m
(Either (RuntimeError p) (GVal (Run p m h)))
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT (ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
-> StateT
(RunState p m h)
(ReaderT (GingerContext p m h) m)
(Either (RuntimeError p) (GVal (Run p m h)))
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (Template p
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
forall p (m :: * -> *) h.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Template p -> Run p m h (GVal (Run p m h))
runTemplate Template p
tpl)) (Template p -> RunState p m h
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Template p -> RunState p m h
defRunState Template p
tpl)) GingerContext p m h
context
baseTemplate :: Template p -> Template p
baseTemplate :: Template p -> Template p
baseTemplate Template p
t =
case Template p -> Maybe (Template p)
forall a. Template a -> Maybe (Template a)
templateParent Template p
t of
Maybe (Template p)
Nothing -> Template p
t
Just Template p
p -> Template p -> Template p
forall p. Template p -> Template p
baseTemplate Template p
p
runTemplate :: ( ToGVal (Run p m h) h
, ToGVal (Run p m h) p
, Monoid h
, Monad m
)
=> Template p
-> Run p m h (GVal (Run p m h))
runTemplate :: Template p -> Run p m h (GVal (Run p m h))
runTemplate =
Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement (Statement p -> Run p m h (GVal (Run p m h)))
-> (Template p -> Statement p)
-> Template p
-> Run p m h (GVal (Run p m h))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Template p -> Statement p
forall a. Template a -> Statement a
templateBody (Template p -> Statement p)
-> (Template p -> Template p) -> Template p -> Statement p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Template p -> Template p
forall p. Template p -> Template p
baseTemplate
withTemplate :: Monad m
=> Template p
-> Run p m h a
-> Run p m h a
withTemplate :: Template p -> Run p m h a -> Run p m h a
withTemplate Template p
tpl Run p m h a
a = do
Template p
oldTpl <- (RunState p m h -> Template p)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Template p)
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets RunState p m h -> Template p
forall p (m :: * -> *) h. RunState p m h -> Template p
rsCurrentTemplate
Maybe Text
oldBlockName <- (RunState p m h -> Maybe Text)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe Text)
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets RunState p m h -> Maybe Text
forall p (m :: * -> *) h. RunState p m h -> Maybe Text
rsCurrentBlockName
(RunState p m h -> RunState p m h)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (\RunState p m h
s -> RunState p m h
s { rsCurrentTemplate :: Template p
rsCurrentTemplate = Template p
tpl, rsCurrentBlockName :: Maybe Text
rsCurrentBlockName = Maybe Text
forall a. Maybe a
Nothing })
a
result <- p -> Run p m h a -> Run p m h a
forall (m :: * -> *) p h a.
Monad m =>
p -> Run p m h a -> Run p m h a
withSourcePos (Template p -> p
forall (f :: * -> *) p. Annotated f => f p -> p
annotation Template p
tpl) Run p m h a
a
(RunState p m h -> RunState p m h)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (\RunState p m h
s -> RunState p m h
s { rsCurrentTemplate :: Template p
rsCurrentTemplate = Template p
oldTpl, rsCurrentBlockName :: Maybe Text
rsCurrentBlockName = Maybe Text
oldBlockName })
a -> Run p m h a
forall (m :: * -> *) a. Monad m => a -> m a
return a
result
withBlockName :: Monad m
=> VarName
-> Run p m h a
-> Run p m h a
withBlockName :: Text -> Run p m h a -> Run p m h a
withBlockName Text
blockName Run p m h a
a = do
Maybe Text
oldBlockName <- (RunState p m h -> Maybe Text)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe Text)
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets RunState p m h -> Maybe Text
forall p (m :: * -> *) h. RunState p m h -> Maybe Text
rsCurrentBlockName
(RunState p m h -> RunState p m h)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (\RunState p m h
s -> RunState p m h
s { rsCurrentBlockName :: Maybe Text
rsCurrentBlockName = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
blockName })
a
result <- Run p m h a
a
(RunState p m h -> RunState p m h)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (\RunState p m h
s -> RunState p m h
s { rsCurrentBlockName :: Maybe Text
rsCurrentBlockName = Maybe Text
oldBlockName })
a -> Run p m h a
forall (m :: * -> *) a. Monad m => a -> m a
return a
result
lookupBlock :: Monad m => VarName -> Run p m h (Block p)
lookupBlock :: Text -> Run p m h (Block p)
lookupBlock Text
blockName = do
Template p
tpl <- (RunState p m h -> Template p)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Template p)
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets RunState p m h -> Template p
forall p (m :: * -> *) h. RunState p m h -> Template p
rsCurrentTemplate
let blockMay :: Maybe (Block p)
blockMay = Text -> Template p -> Maybe (Block p)
forall p. Text -> Template p -> Maybe (Block p)
resolveBlock Text
blockName Template p
tpl
case Maybe (Block p)
blockMay of
Maybe (Block p)
Nothing -> RuntimeError p -> Run p m h (Block p)
forall (m :: * -> *) p h a.
Monad m =>
RuntimeError p -> Run p m h a
throwHere (RuntimeError p -> Run p m h (Block p))
-> RuntimeError p -> Run p m h (Block p)
forall a b. (a -> b) -> a -> b
$ Text -> RuntimeError p
forall p. Text -> RuntimeError p
UndefinedBlockError Text
blockName
Just Block p
block -> Block p -> Run p m h (Block p)
forall (m :: * -> *) a. Monad m => a -> m a
return Block p
block
where
resolveBlock :: VarName -> Template p -> Maybe (Block p)
resolveBlock :: Text -> Template p -> Maybe (Block p)
resolveBlock Text
name Template p
tpl =
case Text -> HashMap Text (Block p) -> Maybe (Block p)
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
HashMap.lookup Text
name (Template p -> HashMap Text (Block p)
forall a. Template a -> HashMap Text (Block a)
templateBlocks Template p
tpl) of
Just Block p
block ->
Block p -> Maybe (Block p)
forall (m :: * -> *) a. Monad m => a -> m a
return Block p
block
Maybe (Block p)
Nothing ->
Template p -> Maybe (Template p)
forall a. Template a -> Maybe (Template a)
templateParent Template p
tpl Maybe (Template p)
-> (Template p -> Maybe (Block p)) -> Maybe (Block p)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text -> Template p -> Maybe (Block p)
forall p. Text -> Template p -> Maybe (Block p)
resolveBlock Text
name
runStatement :: forall m h p
. ( ToGVal (Run p m h) h
, ToGVal (Run p m h) p
, Monoid h
, Monad m
)
=> Statement p
-> Run p m h (GVal (Run p m h))
runStatement :: Statement p -> Run p m h (GVal (Run p m h))
runStatement Statement p
stmt =
p -> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h a.
Monad m =>
p -> Run p m h a -> Run p m h a
withSourcePos
(Statement p -> p
forall (f :: * -> *) p. Annotated f => f p -> p
annotation Statement p
stmt)
(Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement' Statement p
stmt)
runStatement' :: forall m h p
. ( ToGVal (Run p m h) h
, ToGVal (Run p m h) p
, Monoid h
, Monad m
)
=> Statement p
-> Run p m h (GVal (Run p m h))
runStatement' :: Statement p -> Run p m h (GVal (Run p m h))
runStatement' (NullS p
_) =
GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return GVal (Run p m h)
forall a. Default a => a
def
runStatement' (MultiS p
_ [Statement p]
xs) =
[Statement p]
-> (Statement p -> Run p m h (GVal (Run p m h)))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[GVal (Run p m h)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [Statement p]
xs Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[GVal (Run p m h)]
-> ([GVal (Run p m h)] -> Run p m h (GVal (Run p m h)))
-> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
[] -> GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return GVal (Run p m h)
forall a. Default a => a
def
[GVal (Run p m h)]
rvals -> GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return (GVal (Run p m h) -> Run p m h (GVal (Run p m h)))
-> GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ [GVal (Run p m h)] -> GVal (Run p m h)
forall a. [a] -> a
List.last [GVal (Run p m h)]
rvals
runStatement' (LiteralS p
_ Html
html) =
GVal (Run p m h) -> Run p m h ()
forall (m :: * -> *) h p.
(Monad m, Monoid h) =>
GVal (Run p m h) -> Run p m h ()
echo (Html -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal Html
html) Run p m h ()
-> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return GVal (Run p m h)
forall a. Default a => a
def
runStatement' (InterpolationS p
_ Expression p
expr) =
Expression p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
expr Run p m h (GVal (Run p m h))
-> (GVal (Run p m h) -> Run p m h ()) -> Run p m h ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= GVal (Run p m h) -> Run p m h ()
forall (m :: * -> *) h p.
(Monad m, Monoid h) =>
GVal (Run p m h) -> Run p m h ()
echo Run p m h ()
-> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return GVal (Run p m h)
forall a. Default a => a
def
runStatement' (ExpressionS p
_ Expression p
expr) =
Expression p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
expr
runStatement' (IfS p
_ Expression p
condExpr Statement p
true Statement p
false) = do
GVal (Run p m h)
cond <- Expression p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
condExpr
Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement (Statement p -> Run p m h (GVal (Run p m h)))
-> Statement p -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ if GVal (Run p m h) -> Bool
forall (m :: * -> *). GVal m -> Bool
toBoolean GVal (Run p m h)
cond then Statement p
true else Statement p
false
runStatement' (IndentS p
_ Expression p
expr Statement p
body) = do
GVal (Run p m h)
i <- Expression p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
expr
GVal (Run p m h) -> h
encode <- (GingerContext p m h -> GVal (Run p m h) -> h)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h) -> h)
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks GingerContext p m h -> GVal (Run p m h) -> h
forall p (m :: * -> *) h.
GingerContext p m h -> GVal (Run p m h) -> h
contextEncode
let istr :: h
istr = GVal (Run p m h) -> h
encode GVal (Run p m h)
i
h -> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p a.
(Monad m, Monoid h) =>
h -> Run p m h a -> Run p m h a
indented h
istr (Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h)))
-> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement Statement p
body
runStatement' (SwitchS p
_ Expression p
pivotExpr [(Expression p, Statement p)]
cases Statement p
defBranch) = do
GVal (Run p m h)
pivot <- Expression p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
pivotExpr
let branches :: [Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))]
branches =
[ \Run p m h (GVal (Run p m h))
cont -> do
GVal (Run p m h)
cond <- Expression p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
condExpr
if GVal (Run p m h)
pivot GVal (Run p m h) -> GVal (Run p m h) -> Bool
forall (m :: * -> *). GVal m -> GVal m -> Bool
`looseEquals` GVal (Run p m h)
cond
then Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement Statement p
body
else Run p m h (GVal (Run p m h))
cont
| (Expression p
condExpr, Statement p
body)
<- [(Expression p, Statement p)]
cases
] [Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))]
-> [Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))]
-> [Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))]
forall a. [a] -> [a] -> [a]
++
[ Run p m h (GVal (Run p m h))
-> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall a b. a -> b -> a
Prelude.const (Run p m h (GVal (Run p m h))
-> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h)))
-> Run p m h (GVal (Run p m h))
-> Run p m h (GVal (Run p m h))
-> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement Statement p
defBranch ]
[Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
go [Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))]
branches
where
go :: [ Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h)) ]
-> Run p m h (GVal (Run p m h))
go :: [Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
go [] = GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return GVal (Run p m h)
forall a. Default a => a
def
go (Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
x:[Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))]
xs) = Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
x ([Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
go [Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))]
xs)
runStatement' (SetVarS p
_ Text
name Expression p
valExpr) = do
GVal (Run p m h)
val <- Expression p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
valExpr
Text -> GVal (Run p m h) -> Run p m h ()
forall (m :: * -> *) p h.
Monad m =>
Text -> GVal (Run p m h) -> Run p m h ()
setVar Text
name GVal (Run p m h)
val
GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return GVal (Run p m h)
forall a. Default a => a
def
runStatement' (DefMacroS p
_ Text
name Macro p
macro) = do
let val :: GVal (Run p m h)
val = Macro p -> GVal (Run p m h)
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Macro p -> GVal (Run p m h)
macroToGVal Macro p
macro
Text -> GVal (Run p m h) -> Run p m h ()
forall (m :: * -> *) p h.
Monad m =>
Text -> GVal (Run p m h) -> Run p m h ()
setVar Text
name GVal (Run p m h)
val
GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return GVal (Run p m h)
forall a. Default a => a
def
runStatement' (BlockRefS p
_ Text
blockName) = do
Block p
block <- Text -> Run p m h (Block p)
forall (m :: * -> *) p h. Monad m => Text -> Run p m h (Block p)
lookupBlock Text
blockName
Text
-> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h a.
Monad m =>
Text -> Run p m h a -> Run p m h a
withBlockName Text
blockName (Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h)))
-> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$
Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement (Block p -> Statement p
forall a. Block a -> Statement a
blockBody Block p
block)
runStatement' (ScopedS p
_ Statement p
body) = Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h a. Monad m => Run p m h a -> Run p m h a
withLocalScope Run p m h (GVal (Run p m h))
Monad m => Run p m h (GVal (Run p m h))
runInner
where
runInner :: Monad m => Run p m h (GVal (Run p m h))
runInner :: Run p m h (GVal (Run p m h))
runInner = Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement Statement p
body
runStatement' (ForS p
_ Maybe Text
varNameIndex Text
varNameValue Expression p
itereeExpr Statement p
body) = do
let go :: Int -> GVal (Run p m h) -> Run p m h (GVal (Run p m h))
go :: Int -> GVal (Run p m h) -> Run p m h (GVal (Run p m h))
go Int
recursionDepth GVal (Run p m h)
iteree = do
[(GVal (Run p m h), GVal (Run p m h))]
iterPairs <- if Maybe [(Text, GVal (Run p m h))] -> Bool
forall a. Maybe a -> Bool
isJust (GVal (Run p m h) -> Maybe [(Text, GVal (Run p m h))]
forall (m :: * -> *). GVal m -> Maybe [(Text, GVal m)]
asDictItems GVal (Run p m h)
iteree)
then [(GVal (Run p m h), GVal (Run p m h))]
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[(GVal (Run p m h), GVal (Run p m h))]
forall (m :: * -> *) a. Monad m => a -> m a
return [ (Text -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal Text
k, GVal (Run p m h)
v) | (Text
k, GVal (Run p m h)
v) <- [(Text, GVal (Run p m h))]
-> Maybe [(Text, GVal (Run p m h))] -> [(Text, GVal (Run p m h))]
forall a. a -> Maybe a -> a
fromMaybe [] (GVal (Run p m h) -> Maybe [(Text, GVal (Run p m h))]
forall (m :: * -> *). GVal m -> Maybe [(Text, GVal m)]
asDictItems GVal (Run p m h)
iteree) ]
else case GVal (Run p m h) -> Maybe [GVal (Run p m h)]
forall (m :: * -> *). GVal m -> Maybe [GVal m]
asList GVal (Run p m h)
iteree of
Just [GVal (Run p m h)]
items -> [(GVal (Run p m h), GVal (Run p m h))]
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[(GVal (Run p m h), GVal (Run p m h))]
forall (m :: * -> *) a. Monad m => a -> m a
return ([(GVal (Run p m h), GVal (Run p m h))]
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[(GVal (Run p m h), GVal (Run p m h))])
-> [(GVal (Run p m h), GVal (Run p m h))]
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[(GVal (Run p m h), GVal (Run p m h))]
forall a b. (a -> b) -> a -> b
$ [GVal (Run p m h)]
-> [GVal (Run p m h)] -> [(GVal (Run p m h), GVal (Run p m h))]
forall a b. [a] -> [b] -> [(a, b)]
Prelude.zip ((Int -> GVal (Run p m h)) -> [Int] -> [GVal (Run p m h)]
forall a b. (a -> b) -> [a] -> [b]
Prelude.map Int -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal ([Int
0..] :: [Int])) [GVal (Run p m h)]
items
Maybe [GVal (Run p m h)]
Nothing -> do
RuntimeError p -> Run p m h ()
forall (m :: * -> *) p h. Monad m => RuntimeError p -> Run p m h ()
warn (RuntimeError p -> Run p m h ()) -> RuntimeError p -> Run p m h ()
forall a b. (a -> b) -> a -> b
$ [Text] -> Maybe Text -> RuntimeError p
forall p. [Text] -> Maybe Text -> RuntimeError p
TypeError [Text
"list", Text
"dictionary"] (Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> Text -> Maybe Text
forall a b. (a -> b) -> a -> b
$ GVal (Run p m h) -> Text
forall a. Show a => a -> Text
tshow GVal (Run p m h)
iteree)
[(GVal (Run p m h), GVal (Run p m h))]
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[(GVal (Run p m h), GVal (Run p m h))]
forall (m :: * -> *) a. Monad m => a -> m a
return []
let numItems :: Int
numItems :: Int
numItems = [(GVal (Run p m h), GVal (Run p m h))] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
Prelude.length [(GVal (Run p m h), GVal (Run p m h))]
iterPairs
cycle :: Int -> [(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h))
cycle :: Int
-> [(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h))
cycle Int
index [(Maybe Text, GVal (Run p m h))]
args = GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return
(GVal (Run p m h) -> Run p m h (GVal (Run p m h)))
-> ([(Maybe Text, GVal (Run p m h))] -> GVal (Run p m h))
-> [(Maybe Text, GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GVal (Run p m h) -> Maybe (GVal (Run p m h)) -> GVal (Run p m h)
forall a. a -> Maybe a -> a
fromMaybe GVal (Run p m h)
forall a. Default a => a
def
(Maybe (GVal (Run p m h)) -> GVal (Run p m h))
-> ([(Maybe Text, GVal (Run p m h))] -> Maybe (GVal (Run p m h)))
-> [(Maybe Text, GVal (Run p m h))]
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [GVal (Run p m h)] -> Maybe (GVal (Run p m h))
forall a. [a] -> Maybe a
headMay
([GVal (Run p m h)] -> Maybe (GVal (Run p m h)))
-> ([(Maybe Text, GVal (Run p m h))] -> [GVal (Run p m h)])
-> [(Maybe Text, GVal (Run p m h))]
-> Maybe (GVal (Run p m h))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [GVal (Run p m h)] -> [GVal (Run p m h)]
forall a. Int -> [a] -> [a]
Prelude.drop (Int
index Int -> Int -> Int
forall a. Integral a => a -> a -> a
`Prelude.mod` [(Maybe Text, GVal (Run p m h))] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
Prelude.length [(Maybe Text, GVal (Run p m h))]
args)
([GVal (Run p m h)] -> [GVal (Run p m h)])
-> ([(Maybe Text, GVal (Run p m h))] -> [GVal (Run p m h)])
-> [(Maybe Text, GVal (Run p m h))]
-> [GVal (Run p m h)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Maybe Text, GVal (Run p m h)) -> GVal (Run p m h))
-> [(Maybe Text, GVal (Run p m h))] -> [GVal (Run p m h)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Maybe Text, GVal (Run p m h)) -> GVal (Run p m h)
forall a b. (a, b) -> b
snd
([(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h)))
-> [(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ [(Maybe Text, GVal (Run p m h))]
args
loop :: [(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h))
loop :: [(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h))
loop [] = RuntimeError p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h a.
Monad m =>
RuntimeError p -> Run p m h a
throwHere (RuntimeError p -> Run p m h (GVal (Run p m h)))
-> RuntimeError p -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ Maybe Text -> Text -> RuntimeError p
forall p. Maybe Text -> Text -> RuntimeError p
ArgumentsError (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"loop") Text
"at least one argument is required"
loop ((Maybe Text
_, GVal (Run p m h)
loopee):[(Maybe Text, GVal (Run p m h))]
_) = Int -> GVal (Run p m h) -> Run p m h (GVal (Run p m h))
go (Int -> Int
forall a. Enum a => a -> a
Prelude.succ Int
recursionDepth) GVal (Run p m h)
loopee
iteration :: (Int, (GVal (Run p m h), GVal (Run p m h)))
-> Run p m h (GVal (Run p m h))
iteration :: (Int, (GVal (Run p m h), GVal (Run p m h)))
-> Run p m h (GVal (Run p m h))
iteration (Int
index, (GVal (Run p m h)
key, GVal (Run p m h)
value)) = do
Text -> GVal (Run p m h) -> Run p m h ()
forall (m :: * -> *) p h.
Monad m =>
Text -> GVal (Run p m h) -> Run p m h ()
setVar Text
varNameValue GVal (Run p m h)
value
Text -> GVal (Run p m h) -> Run p m h ()
forall (m :: * -> *) p h.
Monad m =>
Text -> GVal (Run p m h) -> Run p m h ()
setVar Text
"loop" (GVal (Run p m h) -> Run p m h ())
-> GVal (Run p m h) -> Run p m h ()
forall a b. (a -> b) -> a -> b
$
([(Text, GVal (Run p m h))] -> GVal (Run p m h)
forall (m :: * -> *). [Pair m] -> GVal m
dict [ Text
"index" Text -> Int -> (Text, GVal (Run p m h))
forall (m :: * -> *) a. ToGVal m a => Text -> a -> Pair m
~> Int -> Int
forall a. Enum a => a -> a
Prelude.succ Int
index
, Text
"index0" Text -> Int -> (Text, GVal (Run p m h))
forall (m :: * -> *) a. ToGVal m a => Text -> a -> Pair m
~> Int
index
, Text
"revindex" Text -> Int -> (Text, GVal (Run p m h))
forall (m :: * -> *) a. ToGVal m a => Text -> a -> Pair m
~> (Int
numItems Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
index)
, Text
"revindex0" Text -> Int -> (Text, GVal (Run p m h))
forall (m :: * -> *) a. ToGVal m a => Text -> a -> Pair m
~> (Int
numItems Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
index Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
, Text
"depth" Text -> Int -> (Text, GVal (Run p m h))
forall (m :: * -> *) a. ToGVal m a => Text -> a -> Pair m
~> Int -> Int
forall a. Enum a => a -> a
Prelude.succ Int
recursionDepth
, Text
"depth0" Text -> Int -> (Text, GVal (Run p m h))
forall (m :: * -> *) a. ToGVal m a => Text -> a -> Pair m
~> Int
recursionDepth
, Text
"first" Text -> Bool -> (Text, GVal (Run p m h))
forall (m :: * -> *) a. ToGVal m a => Text -> a -> Pair m
~> (Int
index Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0)
, Text
"last" Text -> Bool -> (Text, GVal (Run p m h))
forall (m :: * -> *) a. ToGVal m a => Text -> a -> Pair m
~> (Int -> Int
forall a. Enum a => a -> a
Prelude.succ Int
index Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
numItems)
, Text
"length" Text -> Int -> (Text, GVal (Run p m h))
forall (m :: * -> *) a. ToGVal m a => Text -> a -> Pair m
~> Int
numItems
, Text
"cycle" Text -> GVal (Run p m h) -> (Text, GVal (Run p m h))
forall (m :: * -> *) a. ToGVal m a => Text -> a -> Pair m
~> ([(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h)))
-> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction (Int
-> [(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h))
cycle Int
index)
])
{ asFunction :: Maybe
([(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h)))
asFunction = ([(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h)))
-> Maybe
([(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h)))
forall a. a -> Maybe a
Just [(Maybe Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h))
loop }
case Maybe Text
varNameIndex of
Maybe Text
Nothing -> () -> Run p m h ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
forall a. Default a => a
def
Just Text
n -> Text -> GVal (Run p m h) -> Run p m h ()
forall (m :: * -> *) p h.
Monad m =>
Text -> GVal (Run p m h) -> Run p m h ()
setVar Text
n GVal (Run p m h)
key
Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement Statement p
body
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[GVal (Run p m h)]
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[GVal (Run p m h)]
forall (m :: * -> *) p h a. Monad m => Run p m h a -> Run p m h a
withLocalScope (ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[GVal (Run p m h)]
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[GVal (Run p m h)])
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[GVal (Run p m h)]
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[GVal (Run p m h)]
forall a b. (a -> b) -> a -> b
$ [(Int, (GVal (Run p m h), GVal (Run p m h)))]
-> ((Int, (GVal (Run p m h), GVal (Run p m h)))
-> Run p m h (GVal (Run p m h)))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[GVal (Run p m h)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM ([Int]
-> [(GVal (Run p m h), GVal (Run p m h))]
-> [(Int, (GVal (Run p m h), GVal (Run p m h)))]
forall a b. [a] -> [b] -> [(a, b)]
Prelude.zip [Int
0..] [(GVal (Run p m h), GVal (Run p m h))]
iterPairs) (Int, (GVal (Run p m h), GVal (Run p m h)))
-> Run p m h (GVal (Run p m h))
iteration) ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[GVal (Run p m h)]
-> ([GVal (Run p m h)] -> Run p m h (GVal (Run p m h)))
-> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
[] -> GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return GVal (Run p m h)
forall a. Default a => a
def
[GVal (Run p m h)]
rvals -> GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return (GVal (Run p m h) -> Run p m h (GVal (Run p m h)))
-> GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ [GVal (Run p m h)] -> GVal (Run p m h)
forall a. [a] -> a
List.last [GVal (Run p m h)]
rvals
Expression p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
itereeExpr Run p m h (GVal (Run p m h))
-> (GVal (Run p m h) -> Run p m h (GVal (Run p m h)))
-> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Int -> GVal (Run p m h) -> Run p m h (GVal (Run p m h))
go Int
0
runStatement' (PreprocessedIncludeS p
_ Template p
tpl) =
Template p
-> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h a.
Monad m =>
Template p -> Run p m h a -> Run p m h a
withTemplate Template p
tpl (Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h)))
-> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ Template p -> Run p m h (GVal (Run p m h))
forall p (m :: * -> *) h.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Template p -> Run p m h (GVal (Run p m h))
runTemplate Template p
tpl
runStatement' (TryCatchS p
_ Statement p
tryS [CatchBlock p]
catchesS Statement p
finallyS) = do
GVal (Run p m h)
result <- (Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement Statement p
tryS) Run p m h (GVal (Run p m h))
-> (RuntimeError p -> Run p m h (GVal (Run p m h)))
-> Run p m h (GVal (Run p m h))
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
`catchError` [CatchBlock p] -> RuntimeError p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h p.
(Monad m,
ToGVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m)))
p,
ToGVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m)))
h,
ToGVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m)))
p,
Monoid h) =>
[CatchBlock p]
-> RuntimeError p
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))))
handle [CatchBlock p]
catchesS
Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement Statement p
finallyS
GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return GVal (Run p m h)
result
where
handle :: [CatchBlock p]
-> RuntimeError p
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))))
handle [] RuntimeError p
e = GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m)))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))))
forall (m :: * -> *) a. Monad m => a -> m a
return GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m)))
forall a. Default a => a
def
handle ((Catch Maybe Text
whatMay Maybe Text
varNameMay Statement p
catchS):[CatchBlock p]
catches) RuntimeError p
e = do
let what :: Text
what = RuntimeError p -> Text
forall p. RuntimeError p -> Text
runtimeErrorWhat RuntimeError p
e
if Maybe Text
whatMay Maybe Text -> Maybe Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text -> Maybe Text
forall a. a -> Maybe a
Just Text
what Bool -> Bool -> Bool
|| Maybe Text
whatMay Maybe Text -> Maybe Text -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe Text
forall a. Maybe a
Nothing
then
ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))))
forall (m :: * -> *) p h a. Monad m => Run p m h a -> Run p m h a
withLocalScope (ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m)))))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))))
forall a b. (a -> b) -> a -> b
$ do
case Maybe Text
varNameMay of
Maybe Text
Nothing -> ()
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Just Text
varName -> Text
-> GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m)))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
()
forall (m :: * -> *) p h.
Monad m =>
Text -> GVal (Run p m h) -> Run p m h ()
setVar Text
varName (RuntimeError p
-> GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m)))
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal RuntimeError p
e)
Statement p
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement Statement p
catchS
else
[CatchBlock p]
-> RuntimeError p
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))))
handle [CatchBlock p]
catches RuntimeError p
e
macroToGVal :: forall m h p
. ( ToGVal (Run p m h) h
, ToGVal (Run p m h) p
, Monoid h
, Monad m
) => Macro p -> GVal (Run p m h)
macroToGVal :: Macro p -> GVal (Run p m h)
macroToGVal (Macro [Text]
argNames Statement p
body) =
Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
f
where
f :: Function (Run p m h)
f :: Function (Run p m h)
f [(Maybe Text, GVal (Run p m h))]
args =
ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
forall (m :: * -> *) s a. (Monad m, MonadState s m) => m a -> m a
withLocalState (ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h)))
-> (ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h)))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GingerContext p m h -> GingerContext p m h)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local (\GingerContext p m h
c -> GingerContext p m h
c { contextWrite :: h -> Run p m h ()
contextWrite = h -> Run p m h ()
forall h (m :: * -> *) p. (Monoid h, Monad m) => h -> Run p m h ()
appendCapture }) (ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h)))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ do
Run p m h ()
forall h (m :: * -> *) p. (Monoid h, Monad m) => Run p m h ()
clearCapture
[(Text, GVal (Run p m h))]
-> ((Text, GVal (Run p m h)) -> Run p m h ()) -> Run p m h ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (HashMap Text (GVal (Run p m h)) -> [(Text, GVal (Run p m h))]
forall k v. HashMap k v -> [(k, v)]
HashMap.toList HashMap Text (GVal (Run p m h))
matchedArgs) ((Text -> GVal (Run p m h) -> Run p m h ())
-> (Text, GVal (Run p m h)) -> Run p m h ()
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Text -> GVal (Run p m h) -> Run p m h ()
forall (m :: * -> *) p h.
Monad m =>
Text -> GVal (Run p m h) -> Run p m h ()
setVar)
Text -> GVal (Run p m h) -> Run p m h ()
forall (m :: * -> *) p h.
Monad m =>
Text -> GVal (Run p m h) -> Run p m h ()
setVar Text
"varargs" (GVal (Run p m h) -> Run p m h ())
-> ([GVal (Run p m h)] -> GVal (Run p m h))
-> [GVal (Run p m h)]
-> Run p m h ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [GVal (Run p m h)] -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal ([GVal (Run p m h)] -> Run p m h ())
-> [GVal (Run p m h)] -> Run p m h ()
forall a b. (a -> b) -> a -> b
$ [GVal (Run p m h)]
positionalArgs
Text -> GVal (Run p m h) -> Run p m h ()
forall (m :: * -> *) p h.
Monad m =>
Text -> GVal (Run p m h) -> Run p m h ()
setVar Text
"kwargs" (GVal (Run p m h) -> Run p m h ())
-> (HashMap Text (GVal (Run p m h)) -> GVal (Run p m h))
-> HashMap Text (GVal (Run p m h))
-> Run p m h ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HashMap Text (GVal (Run p m h)) -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal (HashMap Text (GVal (Run p m h)) -> Run p m h ())
-> HashMap Text (GVal (Run p m h)) -> Run p m h ()
forall a b. (a -> b) -> a -> b
$ HashMap Text (GVal (Run p m h))
namedArgs
Statement p
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement Statement p
body
h -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal (h -> GVal (Run p m h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
h
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
h
forall (m :: * -> *) p h. Monad m => Run p m h h
fetchCapture
where
matchArgs' :: [(Maybe Text, GVal (Run p m h))] -> (HashMap Text (GVal (Run p m h)), [GVal (Run p m h)], HashMap Text (GVal (Run p m h)))
matchArgs' :: [(Maybe Text, GVal (Run p m h))]
-> (HashMap Text (GVal (Run p m h)), [GVal (Run p m h)],
HashMap Text (GVal (Run p m h)))
matchArgs' = [Text]
-> [(Maybe Text, GVal (Run p m h))]
-> (HashMap Text (GVal (Run p m h)), [GVal (Run p m h)],
HashMap Text (GVal (Run p m h)))
forall (m :: * -> *).
[Text]
-> [(Maybe Text, GVal m)]
-> (HashMap Text (GVal m), [GVal m], HashMap Text (GVal m))
matchFuncArgs [Text]
argNames
(HashMap Text (GVal (Run p m h))
matchedArgs, [GVal (Run p m h)]
positionalArgs, HashMap Text (GVal (Run p m h))
namedArgs) = [(Maybe Text, GVal (Run p m h))]
-> (HashMap Text (GVal (Run p m h)), [GVal (Run p m h)],
HashMap Text (GVal (Run p m h)))
matchArgs' [(Maybe Text, GVal (Run p m h))]
args
runExpression :: Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
expr =
p -> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h a.
Monad m =>
p -> Run p m h a -> Run p m h a
withSourcePos
(Expression p -> p
forall (f :: * -> *) p. Annotated f => f p -> p
annotation Expression p
expr)
(Expression p -> Run p m h (GVal (Run p m h))
runExpression' Expression p
expr)
runExpression' :: Expression p -> Run p m h (GVal (Run p m h))
runExpression' (StringLiteralE p
_ Text
str) = GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return (GVal (Run p m h) -> Run p m h (GVal (Run p m h)))
-> (Text -> GVal (Run p m h))
-> Text
-> Run p m h (GVal (Run p m h))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal (Text -> Run p m h (GVal (Run p m h)))
-> Text -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ Text
str
runExpression' (NumberLiteralE p
_ Scientific
n) = GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return (GVal (Run p m h) -> Run p m h (GVal (Run p m h)))
-> (Scientific -> GVal (Run p m h))
-> Scientific
-> Run p m h (GVal (Run p m h))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal (Scientific -> Run p m h (GVal (Run p m h)))
-> Scientific -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ Scientific
n
runExpression' (BoolLiteralE p
_ Bool
b) = GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return (GVal (Run p m h) -> Run p m h (GVal (Run p m h)))
-> (Bool -> GVal (Run p m h))
-> Bool
-> Run p m h (GVal (Run p m h))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal (Bool -> Run p m h (GVal (Run p m h)))
-> Bool -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ Bool
b
runExpression' (NullLiteralE p
_) = GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return GVal (Run p m h)
forall a. Default a => a
def
runExpression' (VarE p
_ Text
key) = Text -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h.
Monad m =>
Text -> Run p m h (GVal (Run p m h))
getVar Text
key
runExpression' (ListE p
_ [Expression p]
xs) = [GVal (Run p m h)] -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal ([GVal (Run p m h)] -> GVal (Run p m h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[GVal (Run p m h)]
-> Run p m h (GVal (Run p m h))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Expression p]
-> (Expression p -> Run p m h (GVal (Run p m h)))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[GVal (Run p m h)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [Expression p]
xs Expression p -> Run p m h (GVal (Run p m h))
runExpression
runExpression' (ObjectE p
_ [(Expression p, Expression p)]
xs) = do
[(Text, GVal (Run p m h))]
items <- [(Expression p, Expression p)]
-> ((Expression p, Expression p)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Text, GVal (Run p m h)))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[(Text, GVal (Run p m h))]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [(Expression p, Expression p)]
xs (((Expression p, Expression p)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Text, GVal (Run p m h)))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[(Text, GVal (Run p m h))])
-> ((Expression p, Expression p)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Text, GVal (Run p m h)))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[(Text, GVal (Run p m h))]
forall a b. (a -> b) -> a -> b
$ \(Expression p
a, Expression p
b) -> do
Text
l <- GVal (Run p m h) -> Text
forall (m :: * -> *). GVal m -> Text
asText (GVal (Run p m h) -> Text)
-> Run p m h (GVal (Run p m h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
a
GVal (Run p m h)
r <- Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
b
(Text, GVal (Run p m h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Text, GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return (Text
l, GVal (Run p m h)
r)
GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return (GVal (Run p m h) -> Run p m h (GVal (Run p m h)))
-> ([(Text, GVal (Run p m h))] -> GVal (Run p m h))
-> [(Text, GVal (Run p m h))]
-> Run p m h (GVal (Run p m h))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map Text (GVal (Run p m h)) -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal (Map Text (GVal (Run p m h)) -> GVal (Run p m h))
-> ([(Text, GVal (Run p m h))] -> Map Text (GVal (Run p m h)))
-> [(Text, GVal (Run p m h))]
-> GVal (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Text, GVal (Run p m h))] -> Map Text (GVal (Run p m h))
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h)))
-> [(Text, GVal (Run p m h))] -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ [(Text, GVal (Run p m h))]
items
runExpression' (MemberLookupE p
_ Expression p
baseExpr Expression p
indexExpr) = do
GVal (Run p m h)
base <- Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
baseExpr
GVal (Run p m h)
index <- Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
indexExpr
RuntimeError p
-> GVal (Run p m h)
-> Maybe (GVal (Run p m h))
-> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p a h.
Monad m =>
RuntimeError p -> a -> Maybe a -> Run p m h a
warnFromMaybe (Text -> RuntimeError p
forall p. Text -> RuntimeError p
IndexError (Text -> RuntimeError p) -> Text -> RuntimeError p
forall a b. (a -> b) -> a -> b
$ Text -> Text
forall a. Show a => a -> Text
tshow (GVal (Run p m h) -> Text
forall (m :: * -> *). GVal m -> Text
asText GVal (Run p m h)
index)) GVal (Run p m h)
forall a. Default a => a
def (Maybe (GVal (Run p m h)) -> Run p m h (GVal (Run p m h)))
-> Maybe (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$
GVal (Run p m h) -> GVal (Run p m h) -> Maybe (GVal (Run p m h))
forall (m :: * -> *). GVal m -> GVal m -> Maybe (GVal m)
lookupLoose GVal (Run p m h)
index GVal (Run p m h)
base
runExpression' (CallE p
_ Expression p
funcE [(Maybe Text, Expression p)]
argsEs) = do
[(Maybe Text, GVal (Run p m h))]
args <- [(Maybe Text, Expression p)]
-> ((Maybe Text, Expression p)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe Text, GVal (Run p m h)))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[(Maybe Text, GVal (Run p m h))]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [(Maybe Text, Expression p)]
argsEs (((Maybe Text, Expression p)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe Text, GVal (Run p m h)))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[(Maybe Text, GVal (Run p m h))])
-> ((Maybe Text, Expression p)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe Text, GVal (Run p m h)))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[(Maybe Text, GVal (Run p m h))]
forall a b. (a -> b) -> a -> b
$
\(Maybe Text
argName, Expression p
argE) -> (Maybe Text
argName,) (GVal (Run p m h) -> (Maybe Text, GVal (Run p m h)))
-> Run p m h (GVal (Run p m h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe Text, GVal (Run p m h))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
argE
GVal (Run p m h)
e <- Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
funcE
let func :: Maybe (Function (Run p m h))
func = GVal (Run p m h) -> Maybe (Function (Run p m h))
forall (m :: * -> *). GVal m -> Maybe (Function m)
toFunction GVal (Run p m h)
e
case Maybe (Function (Run p m h))
func of
Maybe (Function (Run p m h))
Nothing -> do
RuntimeError p -> Run p m h ()
forall (m :: * -> *) p h. Monad m => RuntimeError p -> Run p m h ()
warn RuntimeError p
forall p. RuntimeError p
NotAFunctionError
GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return GVal (Run p m h)
forall a. Default a => a
def
Just Function (Run p m h)
f -> Function (Run p m h)
f [(Maybe Text, GVal (Run p m h))]
args
runExpression' (LambdaE p
_ [Text]
argNames Expression p
body) = do
let fn :: [(a, GVal (Run p m h))] -> Run p m h (GVal (Run p m h))
fn [(a, GVal (Run p m h))]
args = Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h a. Monad m => Run p m h a -> Run p m h a
withLocalScope (Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h)))
-> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ do
[(Text, GVal (Run p m h))]
-> ((Text, GVal (Run p m h)) -> Run p m h ()) -> Run p m h ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ ([Text] -> [GVal (Run p m h)] -> [(Text, GVal (Run p m h))]
forall a b. [a] -> [b] -> [(a, b)]
Prelude.zip [Text]
argNames (((a, GVal (Run p m h)) -> GVal (Run p m h))
-> [(a, GVal (Run p m h))] -> [GVal (Run p m h)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, GVal (Run p m h)) -> GVal (Run p m h)
forall a b. (a, b) -> b
snd [(a, GVal (Run p m h))]
args)) (((Text, GVal (Run p m h)) -> Run p m h ()) -> Run p m h ())
-> ((Text, GVal (Run p m h)) -> Run p m h ()) -> Run p m h ()
forall a b. (a -> b) -> a -> b
$ (Text -> GVal (Run p m h) -> Run p m h ())
-> (Text, GVal (Run p m h)) -> Run p m h ()
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Text -> GVal (Run p m h) -> Run p m h ()
forall (m :: * -> *) p h.
Monad m =>
Text -> GVal (Run p m h) -> Run p m h ()
setVar
Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
body
GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return (GVal (Run p m h) -> Run p m h (GVal (Run p m h)))
-> GVal (Run p m h) -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ Function (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). Function m -> GVal m
fromFunction Function (Run p m h)
forall a. [(a, GVal (Run p m h))] -> Run p m h (GVal (Run p m h))
fn
runExpression' (TernaryE p
_ Expression p
condition Expression p
yes Expression p
no) = do
GVal (Run p m h)
condVal <- Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
condition
let expr :: Expression p
expr = if GVal (Run p m h) -> Bool
forall (m :: * -> *). GVal m -> Bool
asBoolean GVal (Run p m h)
condVal then Expression p
yes else Expression p
no
Expression p -> Run p m h (GVal (Run p m h))
runExpression Expression p
expr
runExpression' (DoE p
_ Statement p
stmt) =
Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement Statement p
stmt
echo :: (Monad m, Monoid h)
=> GVal (Run p m h) -> Run p m h ()
echo :: GVal (Run p m h) -> Run p m h ()
echo GVal (Run p m h)
src = do
GVal (Run p m h) -> h
e <- (GingerContext p m h -> GVal (Run p m h) -> h)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(GVal (Run p m h) -> h)
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks GingerContext p m h -> GVal (Run p m h) -> h
forall p (m :: * -> *) h.
GingerContext p m h -> GVal (Run p m h) -> h
contextEncode
h -> Run p m h ()
p <- (GingerContext p m h -> h -> Run p m h ())
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(h -> Run p m h ())
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks GingerContext p m h -> h -> Run p m h ()
forall p (m :: * -> *) h. GingerContext p m h -> h -> Run p m h ()
contextWrite
(GingerContext p m h -> Maybe (Newlines h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe (Newlines h))
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks GingerContext p m h -> Maybe (Newlines h)
forall p (m :: * -> *) h. GingerContext p m h -> Maybe (Newlines h)
contextNewlines ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe (Newlines h))
-> (Maybe (Newlines h) -> Run p m h ()) -> Run p m h ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Maybe (Newlines h)
Nothing ->
h -> Run p m h ()
p (h -> Run p m h ())
-> (GVal (Run p m h) -> h) -> GVal (Run p m h) -> Run p m h ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GVal (Run p m h) -> h
e (GVal (Run p m h) -> Run p m h ())
-> GVal (Run p m h) -> Run p m h ()
forall a b. (a -> b) -> a -> b
$ GVal (Run p m h)
src
Just Newlines h
newlines -> do
[h]
indentation <- [h] -> Maybe [h] -> [h]
forall a. a -> Maybe a -> a
fromMaybe [] (Maybe [h] -> [h])
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe [h])
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
[h]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RunState p m h -> Maybe [h])
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe [h])
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets RunState p m h -> Maybe [h]
forall p (m :: * -> *) h. RunState p m h -> Maybe [h]
rsIndentation
let ls :: [h]
ls = Newlines h -> h -> [h]
forall h. Newlines h -> h -> [h]
splitLines Newlines h
newlines (h -> [h]) -> h -> [h]
forall a b. (a -> b) -> a -> b
$ GVal (Run p m h) -> h
e GVal (Run p m h)
src
indent :: h
indent = [h] -> h
forall a. Monoid a => [a] -> a
mconcat ([h] -> h) -> ([h] -> [h]) -> [h] -> h
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [h] -> [h]
forall a. [a] -> [a]
List.reverse ([h] -> h) -> [h] -> h
forall a b. (a -> b) -> a -> b
$ [h]
indentation
[h] -> (h -> Run p m h ()) -> Run p m h ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [h]
ls ((h -> Run p m h ()) -> Run p m h ())
-> (h -> Run p m h ()) -> Run p m h ()
forall a b. (a -> b) -> a -> b
$ \h
l -> do
Bool
atLineStart <- (RunState p m h -> Bool)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
Bool
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets RunState p m h -> Bool
forall p (m :: * -> *) h. RunState p m h -> Bool
rsAtLineStart
if Bool
atLineStart
then h -> Run p m h ()
p (h -> Run p m h ()) -> h -> Run p m h ()
forall a b. (a -> b) -> a -> b
$ h
indent h -> h -> h
forall a. Semigroup a => a -> a -> a
<> h
l
else h -> Run p m h ()
p h
l
(RunState p m h -> RunState p m h) -> Run p m h ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((RunState p m h -> RunState p m h) -> Run p m h ())
-> (RunState p m h -> RunState p m h) -> Run p m h ()
forall a b. (a -> b) -> a -> b
$ \RunState p m h
state -> RunState p m h
state {
rsAtLineStart :: Bool
rsAtLineStart = Newlines h -> h -> Bool
forall h. Newlines h -> h -> Bool
endsWithNewline Newlines h
newlines h
l
}
indented :: (Monad m, Monoid h)
=> h
-> Run p m h a
-> Run p m h a
indented :: h -> Run p m h a -> Run p m h a
indented h
i Run p m h a
action = do
h -> Run p m h ()
forall (m :: * -> *) h p. (Monad m, Monoid h) => h -> Run p m h ()
pushIndent h
i Run p m h () -> Run p m h a -> Run p m h a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Run p m h a
action Run p m h a -> Run p m h () -> Run p m h a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Run p m h ()
forall (m :: * -> *) h p. (Monad m, Monoid h) => Run p m h ()
popIndent
pushIndent :: (Monad m, Monoid h)
=> h
-> Run p m h ()
pushIndent :: h -> Run p m h ()
pushIndent h
i =
(RunState p m h -> RunState p m h) -> Run p m h ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((RunState p m h -> RunState p m h) -> Run p m h ())
-> (RunState p m h -> RunState p m h) -> Run p m h ()
forall a b. (a -> b) -> a -> b
$ \RunState p m h
state ->
RunState p m h
state { rsIndentation :: Maybe [h]
rsIndentation = h -> Maybe [h] -> Maybe [h]
forall a. a -> Maybe [a] -> Maybe [a]
increaseIndent h
i (RunState p m h -> Maybe [h]
forall p (m :: * -> *) h. RunState p m h -> Maybe [h]
rsIndentation RunState p m h
state) }
popIndent :: (Monad m, Monoid h)
=> Run p m h ()
popIndent :: Run p m h ()
popIndent =
(RunState p m h -> RunState p m h) -> Run p m h ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((RunState p m h -> RunState p m h) -> Run p m h ())
-> (RunState p m h -> RunState p m h) -> Run p m h ()
forall a b. (a -> b) -> a -> b
$ \RunState p m h
state ->
RunState p m h
state { rsIndentation :: Maybe [h]
rsIndentation = Maybe [h] -> Maybe [h]
forall a. Maybe [a] -> Maybe [a]
decreaseIndent (RunState p m h -> Maybe [h]
forall p (m :: * -> *) h. RunState p m h -> Maybe [h]
rsIndentation RunState p m h
state) }
increaseIndent :: a -> Maybe [a] -> Maybe [a]
increaseIndent :: a -> Maybe [a] -> Maybe [a]
increaseIndent a
_ Maybe [a]
Nothing = [a] -> Maybe [a]
forall a. a -> Maybe a
Just []
increaseIndent a
x (Just [a]
xs) = [a] -> Maybe [a]
forall a. a -> Maybe a
Just (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs)
decreaseIndent :: Maybe [a] -> Maybe [a]
decreaseIndent :: Maybe [a] -> Maybe [a]
decreaseIndent Maybe [a]
Nothing = Maybe [a]
forall a. Maybe a
Nothing
decreaseIndent (Just []) = Maybe [a]
forall a. Maybe a
Nothing
decreaseIndent (Just (a
x:[a]
xs)) = [a] -> Maybe [a]
forall a. a -> Maybe a
Just [a]
xs
defRunState :: forall m h p
. ( ToGVal (Run p m h) h
, ToGVal (Run p m h) p
, Monoid h
, Monad m
)
=> Template p
-> RunState p m h
defRunState :: Template p -> RunState p m h
defRunState Template p
tpl =
RunState :: forall p (m :: * -> *) h.
HashMap Text (GVal (Run p m h))
-> h
-> Template p
-> Maybe Text
-> Maybe [h]
-> Bool
-> p
-> RunState p m h
RunState
{ rsScope :: HashMap Text (GVal (Run p m h))
rsScope = [(Text, GVal (Run p m h))] -> HashMap Text (GVal (Run p m h))
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HashMap.fromList [(Text, GVal (Run p m h))]
forall (m :: * -> *) h p.
(Monoid h, Monad m, ToGVal (Run p m h) h, ToGVal (Run p m h) p) =>
[(Text, GVal (Run p m h))]
defaultScope
, rsCapture :: h
rsCapture = h
forall a. Monoid a => a
mempty
, rsCurrentTemplate :: Template p
rsCurrentTemplate = Template p
tpl
, rsCurrentBlockName :: Maybe Text
rsCurrentBlockName = Maybe Text
forall a. Maybe a
Nothing
, rsIndentation :: Maybe [h]
rsIndentation = Maybe [h]
forall a. Maybe a
Nothing
, rsAtLineStart :: Bool
rsAtLineStart = Bool
True
, rsCurrentSourcePos :: p
rsCurrentSourcePos = Template p -> p
forall (f :: * -> *) p. Annotated f => f p -> p
annotation Template p
tpl
}
gfnThrow :: ( Monad m
, Monoid h
, ToGVal (Run p m h) h
, ToGVal (Run p m h) p
)
=> Function (Run p m h)
gfnThrow :: Function (Run p m h)
gfnThrow [(Maybe Text, GVal (Run p m h))]
args =
RuntimeError p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h a.
Monad m =>
RuntimeError p -> Run p m h a
throwHere (Text -> RuntimeError p
forall p. Text -> RuntimeError p
RuntimeError (Text -> RuntimeError p)
-> ([(Maybe Text, GVal (Run p m h))] -> Text)
-> [(Maybe Text, GVal (Run p m h))]
-> RuntimeError p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Text] -> Text
forall a. Monoid a => [a] -> a
mconcat ([Text] -> Text)
-> ([(Maybe Text, GVal (Run p m h))] -> [Text])
-> [(Maybe Text, GVal (Run p m h))]
-> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Maybe Text, GVal (Run p m h)) -> Text)
-> [(Maybe Text, GVal (Run p m h))] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (GVal (Run p m h) -> Text
forall (m :: * -> *). GVal m -> Text
asText (GVal (Run p m h) -> Text)
-> ((Maybe Text, GVal (Run p m h)) -> GVal (Run p m h))
-> (Maybe Text, GVal (Run p m h))
-> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe Text, GVal (Run p m h)) -> GVal (Run p m h)
forall a b. (a, b) -> b
snd) ([(Maybe Text, GVal (Run p m h))] -> RuntimeError p)
-> [(Maybe Text, GVal (Run p m h))] -> RuntimeError p
forall a b. (a -> b) -> a -> b
$ [(Maybe Text, GVal (Run p m h))]
args)
gfnEval :: ( Monad m
, Monoid h
, ToGVal (Run p m h) h
, ToGVal (Run p m h) p
)
=> Function (Run p m h)
gfnEval :: Function (Run p m h)
gfnEval [(Maybe Text, GVal (Run p m h))]
args =
let extracted :: Either
([GVal (Run p m h)], HashMap Text (GVal (Run p m h)), [Text])
[GVal (Run p m h)]
extracted =
[(Text, GVal (Run p m h))]
-> [(Maybe Text, GVal (Run p m h))]
-> Either
([GVal (Run p m h)], HashMap Text (GVal (Run p m h)), [Text])
[GVal (Run p m h)]
forall a.
[(Text, a)]
-> [(Maybe Text, a)] -> Either ([a], HashMap Text a, [Text]) [a]
extractArgsDefL
[ (Text
"src", GVal (Run p m h)
forall a. Default a => a
def)
, (Text
"context", GVal (Run p m h)
forall a. Default a => a
def)
]
[(Maybe Text, GVal (Run p m h))]
args
in case Either
([GVal (Run p m h)], HashMap Text (GVal (Run p m h)), [Text])
[GVal (Run p m h)]
extracted of
Left ([GVal (Run p m h)], HashMap Text (GVal (Run p m h)), [Text])
_ -> RuntimeError p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) p h a.
Monad m =>
RuntimeError p -> Run p m h a
throwHere (RuntimeError p -> Run p m h (GVal (Run p m h)))
-> RuntimeError p -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ Maybe Text -> Text -> RuntimeError p
forall p. Maybe Text -> Text -> RuntimeError p
ArgumentsError (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"eval") Text
"expected: (src, context)"
Right [GVal (Run p m h)
gSrc, GVal (Run p m h)
gContext] -> do
Either ParserError (Template SourcePos)
result' <- IncludeResolver (Run p m h)
-> Maybe String
-> String
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Either ParserError (Template SourcePos))
forall (m :: * -> *).
Monad m =>
IncludeResolver m
-> Maybe String
-> String
-> m (Either ParserError (Template SourcePos))
parseGinger
(ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe String)
-> IncludeResolver (Run p m h)
forall a b. a -> b -> a
Prelude.const (ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe String)
-> IncludeResolver (Run p m h))
-> (Maybe String
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe String))
-> Maybe String
-> IncludeResolver (Run p m h)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe String
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Maybe String)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe String -> IncludeResolver (Run p m h))
-> Maybe String -> IncludeResolver (Run p m h)
forall a b. (a -> b) -> a -> b
$ Maybe String
forall a. Maybe a
Nothing)
Maybe String
forall a. Maybe a
Nothing
(Text -> String
Text.unpack (Text -> String)
-> (GVal (Run p m h) -> Text) -> GVal (Run p m h) -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GVal (Run p m h) -> Text
forall (m :: * -> *). GVal m -> Text
asText (GVal (Run p m h) -> String) -> GVal (Run p m h) -> String
forall a b. (a -> b) -> a -> b
$ GVal (Run p m h)
gSrc)
p
pos <- (RunState p m h -> p)
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
p
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets RunState p m h -> p
forall p (m :: * -> *) h. RunState p m h -> p
rsCurrentSourcePos
let result :: Either ParserError (Template p)
result = (SourcePos -> p) -> Template SourcePos -> Template p
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (p -> SourcePos -> p
forall a b. a -> b -> a
Prelude.const p
pos) (Template SourcePos -> Template p)
-> Either ParserError (Template SourcePos)
-> Either ParserError (Template p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Either ParserError (Template SourcePos)
result'
Template p
tpl <- case Either ParserError (Template p)
result of
Left ParserError
err -> RuntimeError p
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Template p)
forall (m :: * -> *) p h a.
Monad m =>
RuntimeError p -> Run p m h a
throwHere (RuntimeError p
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Template p))
-> RuntimeError p
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Template p)
forall a b. (a -> b) -> a -> b
$ ParserError -> RuntimeError p
forall p. ParserError -> RuntimeError p
EvalParseError ParserError
err
Right Template p
t -> Template p
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
(Template p)
forall (m :: * -> *) a. Monad m => a -> m a
return Template p
t
let localLookup :: a -> m (GVal (Run p m h))
localLookup a
varName = GVal (Run p m h) -> m (GVal (Run p m h))
forall (m :: * -> *) a. Monad m => a -> m a
return (GVal (Run p m h) -> m (GVal (Run p m h)))
-> GVal (Run p m h) -> m (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$
GVal (Run p m h)
-> GVal (Run p m h) -> GVal (Run p m h) -> GVal (Run p m h)
forall (m :: * -> *). GVal m -> GVal m -> GVal m -> GVal m
lookupLooseDef GVal (Run p m h)
forall a. Default a => a
def (a -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal a
varName) GVal (Run p m h)
gContext
localContext :: GingerContext p m h -> GingerContext p m h
localContext GingerContext p m h
c = GingerContext p m h
c
{ contextWrite :: h -> Run p m h ()
contextWrite = h -> Run p m h ()
forall h (m :: * -> *) p. (Monoid h, Monad m) => h -> Run p m h ()
appendCapture
, contextLookup :: Text -> Run p m h (GVal (Run p m h))
contextLookup = Text -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) a.
(Monad m, ToGVal (Run p m h) a) =>
a -> m (GVal (Run p m h))
localLookup
}
Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) s a. (Monad m, MonadState s m) => m a -> m a
withLocalState (Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h)))
-> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ do
RunState p m h -> Run p m h ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put (RunState p m h -> Run p m h ()) -> RunState p m h -> Run p m h ()
forall a b. (a -> b) -> a -> b
$ Template p -> RunState p m h
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Template p -> RunState p m h
defRunState Template p
tpl
(GingerContext p m h -> GingerContext p m h)
-> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local GingerContext p m h -> GingerContext p m h
localContext (Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h)))
-> Run p m h (GVal (Run p m h)) -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ do
Run p m h ()
forall h (m :: * -> *) p. (Monoid h, Monad m) => Run p m h ()
clearCapture
Statement p -> Run p m h (GVal (Run p m h))
forall (m :: * -> *) h p.
(ToGVal (Run p m h) h, ToGVal (Run p m h) p, Monoid h, Monad m) =>
Statement p -> Run p m h (GVal (Run p m h))
runStatement (Statement p -> Run p m h (GVal (Run p m h)))
-> Statement p -> Run p m h (GVal (Run p m h))
forall a b. (a -> b) -> a -> b
$ Template p -> Statement p
forall a. Template a -> Statement a
templateBody Template p
tpl
h -> GVal (Run p m h)
forall (m :: * -> *) a. ToGVal m a => a -> GVal m
toGVal (h -> GVal (Run p m h))
-> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
h
-> Run p m h (GVal (Run p m h))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ExceptT
(RuntimeError p)
(StateT (RunState p m h) (ReaderT (GingerContext p m h) m))
h
forall (m :: * -> *) p h. Monad m => Run p m h h
fetchCapture