-- |

-- Module      : JsonLogic.IO.Mapping

-- Description : Internal JsonLogic IO 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.IO.Mapping where

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

toResult :: T.Result IO r -> Result r
toResult :: Result IO r -> Result r
toResult = Result IO r -> Result r
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT

fromResult :: Result r -> T.Result IO r
fromResult :: Result r -> Result IO r
fromResult = Result r -> Result IO r
forall e (m :: * -> *) a. m (Either e a) -> ExceptT e m a
ExceptT

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

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

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

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

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

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

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

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