module JsonLogic.JL where

import Control.Monad.Reader (Reader, asks)
import qualified Data.Map as M
import JsonLogic.Json
import JsonLogic.Type
import qualified JsonLogic.Type as T

-- Our monad type, contains the logicEnv

-- Now we can use JL (which holds our env) when we need it

type JL a m = Reader (JsonLogicEnv m) a

getFunction :: Monad m => String -> JL (Maybe (Function m Json)) m
getFunction :: String -> JL (Maybe (Function m Json)) m
getFunction String
name = (JsonLogicEnv m -> Maybe (Function m Json))
-> JL (Maybe (Function m Json)) m
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks (String -> Map String (Function m Json) -> Maybe (Function m Json)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup String
name (Map String (Function m Json) -> Maybe (Function m Json))
-> (JsonLogicEnv m -> Map String (Function m Json))
-> JsonLogicEnv m
-> Maybe (Function m Json)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JsonLogicEnv m -> Map String (Function m Json)
forall (m :: * -> *). JsonLogicEnv m -> Operations m
T.operations)

getOperations :: Monad m => JL (Operations m) m
getOperations :: JL (Operations m) m
getOperations = (JsonLogicEnv m -> Operations m) -> JL (Operations m) m
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks JsonLogicEnv m -> Operations m
forall (m :: * -> *). JsonLogicEnv m -> Operations m
T.operations

getVariables :: Monad m => JL Json m
getVariables :: JL Json m
getVariables = (JsonLogicEnv m -> Json) -> JL Json m
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks JsonLogicEnv m -> Json
forall (m :: * -> *). JsonLogicEnv m -> Json
T.variables