-- |

-- Module      : JsonLogic.Pure.Mapping

-- Description : Internal JsonLogic Pure functions to map from exposed types to internal types and vice versa

-- Copyright   : (c) Marien Matser, Gerard van Schie, Jelle Teeuwissen, 2022

-- License     : MIT

-- Maintainer  : jelleteeuwissen@hotmail.nl

-- Stability   : experimental

module JsonLogic.Pure.Mapping where

import Control.Monad.Except
import Control.Monad.Identity
import qualified Data.Map as M
import JsonLogic.Pure.Type
import qualified JsonLogic.Type as T

-- These functions are used to remove the monad transformer from the types.


toResult :: T.Result Identity r -> Result r
toResult :: Result Identity r -> Result r
toResult = Identity (Result r) -> Result r
forall a. Identity a -> a
runIdentity (Identity (Result r) -> Result r)
-> (Result Identity r -> Identity (Result r))
-> Result Identity r
-> Result r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Result Identity r -> Identity (Result r)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT

fromResult :: Result r -> T.Result Identity r
fromResult :: Result r -> Result Identity r
fromResult = Result r -> Result Identity r
forall e (m :: * -> *) a. MonadError e m => Either e a -> m a
liftEither

toSubEvaluator :: T.SubEvaluator Identity -> SubEvaluator
toSubEvaluator :: SubEvaluator Identity -> SubEvaluator
toSubEvaluator SubEvaluator Identity
s Rule
r Rule
d = Result Identity Rule -> Result Rule
forall r. Result Identity r -> Result r
toResult (Result Identity Rule -> Result Rule)
-> Result Identity Rule -> Result Rule
forall a b. (a -> b) -> a -> b
$ SubEvaluator Identity
s Rule
r Rule
d

fromSubEvaluator :: SubEvaluator -> T.SubEvaluator Identity
fromSubEvaluator :: SubEvaluator -> SubEvaluator Identity
fromSubEvaluator SubEvaluator
s Rule
r Rule
d = Result Rule -> Result Identity Rule
forall r. Result r -> Result Identity r
fromResult (Result Rule -> Result Identity Rule)
-> Result Rule -> Result Identity Rule
forall a b. (a -> b) -> a -> b
$ SubEvaluator
s Rule
r Rule
d

toFunction :: T.Function Identity r -> Function r
toFunction :: Function Identity r -> Function r
toFunction Function Identity r
f SubEvaluator
s Rule
r Rule
d = Result Identity r -> Result r
forall r. Result Identity r -> Result r
toResult (Result Identity r -> Result r) -> Result Identity r -> Result r
forall a b. (a -> b) -> a -> b
$ Function Identity r
f (SubEvaluator -> SubEvaluator Identity
fromSubEvaluator SubEvaluator
s) Rule
r Rule
d

fromFunction :: Function r -> T.Function Identity r
fromFunction :: Function r -> Function Identity r
fromFunction Function r
f SubEvaluator Identity
s Rule
r Rule
d = Result r -> Result Identity r
forall r. Result r -> Result Identity r
fromResult (Result r -> Result Identity r) -> Result r -> Result Identity r
forall a b. (a -> b) -> a -> b
$ Function r
f (SubEvaluator Identity -> SubEvaluator
toSubEvaluator SubEvaluator Identity
s) Rule
r Rule
d

toOperation :: T.Operation Identity -> Operation
toOperation :: Operation Identity -> Operation
toOperation (String
s, Function Identity Rule
f) = (String
s, Function Identity Rule -> Function Rule
forall r. Function Identity r -> Function r
toFunction Function Identity Rule
f)

fromOperation :: Operation -> T.Operation Identity
fromOperation :: Operation -> Operation Identity
fromOperation (String
s, Function Rule
f) = (String
s, Function Rule -> Function Identity Rule
forall r. Function r -> Function Identity r
fromFunction Function Rule
f)

toOperations :: T.Operations Identity -> Operations
toOperations :: Operations Identity -> Operations
toOperations = (Function Identity Rule -> Function Rule)
-> Operations Identity -> Operations
forall a b k. (a -> b) -> Map k a -> Map k b
M.map Function Identity Rule -> Function Rule
forall r. Function Identity r -> Function r
toFunction

fromOperations :: Operations -> T.Operations Identity
fromOperations :: Operations -> Operations Identity
fromOperations = (Function Rule -> Function Identity Rule)
-> Operations -> Operations Identity
forall a b k. (a -> b) -> Map k a -> Map k b
M.map Function Rule -> Function Identity Rule
forall r. Function r -> Function Identity r
fromFunction