packages feed

jsonlogic-0.1.0.0: src/JsonLogic/IO/Operation.hs

{-# LANGUAGE NoImplicitPrelude #-}

-- |
-- Module      : JsonLogic.IO.Operation
-- Description : JsonLogic IO operations
-- Copyright   : (c) Marien Matser, Gerard van Schie, Jelle Teeuwissen, 2022
-- License     : MIT
-- Maintainer  : jelleteeuwissen@hotmail.nl
-- Stability   : experimental

{- ORMOLU_DISABLE -}
module JsonLogic.IO.Operation
  ( defaultOperations,
    arrayOperations, map, reduce, filter, all, none, some, merge, in',
    booleanOperations, if', (==), (===), (!=), (!==), (!), (!!), and, or,
    dataOperations, var, missing, missingSome, preserve,
    miscOperations, trace, log,
    numericOperations, (>), (>=), (<), (<=), max, min, sum, (+), (-), (*), (/), (%),
    stringOperations, cat, substr,
    evaluateDouble, evaluateInt, evaluateBool, evaluateArray, evaluateObject, evaluateString
  )
where
{- ORMOLU_ENABLE -}
import qualified Data.Map as M
import JsonLogic.IO.Mapping
import JsonLogic.IO.Operation.Misc (log, miscOperations, trace)
import JsonLogic.IO.Type
import JsonLogic.Json
import qualified JsonLogic.Operation as O
import qualified Prelude as P

-- | A map of all the default operations.
defaultOperations :: Operations
defaultOperations = M.unions [arrayOperations, booleanOperations, dataOperations, miscOperations, numericOperations, stringOperations]

-- | Groups of operations on similar data.
arrayOperations, booleanOperations, dataOperations, numericOperations, stringOperations :: Operations
arrayOperations = toOperations O.arrayOperations
booleanOperations = toOperations O.booleanOperations
dataOperations = toOperations O.dataOperations
numericOperations = toOperations O.numericOperations
stringOperations = toOperations O.stringOperations

-- | Array operations.
map, reduce, filter, all, none, some, merge, in' :: Operation
map = toOperation O.map
reduce = toOperation O.reduce
filter = toOperation O.filter
all = toOperation O.all
none = toOperation O.none
some = toOperation O.some
merge = toOperation O.merge
in' = toOperation O.in'

-- | Boolean operations.
if', (==), (===), (!=), (!==), (!), (!!), and, or :: Operation
if' = toOperation O.if'
(==) = toOperation (O.==)
(===) = toOperation (O.===)
(!=) = toOperation (O.!=)
(!==) = toOperation (O.!==)
(!) = toOperation (O.!)
(!!) = toOperation (O.!!)
and = toOperation O.and
or = toOperation O.or

-- | Data operations.
var, missing, missingSome, preserve :: Operation
var = toOperation O.var
missing = toOperation O.missing
missingSome = toOperation O.missingSome
preserve = toOperation O.preserve

-- | Numeric operations.
(>), (>=), (<), (<=), max, min, sum, (+), (-), (*), (/), (%) :: Operation
(>) = toOperation (O.>)
(>=) = toOperation (O.>=)
(<) = toOperation (O.<)
(<=) = toOperation (O.<=)
max = toOperation O.max
min = toOperation O.min
sum = toOperation O.sum
(+) = toOperation (O.+)
(-) = toOperation (O.-)
(*) = toOperation (O.*)
(/) = toOperation (O./)
(%) = toOperation (O.%)

-- | String operations.
cat, substr :: Operation
cat = toOperation O.cat
substr = toOperation O.substr

-- Primitive Evaluators

-- | Evaluate to a double.
evaluateDouble :: Function P.Double
evaluateDouble = toFunction O.evaluateDouble

-- | Evaluate to an int.
evaluateInt :: Function P.Int
evaluateInt = toFunction O.evaluateInt

-- | Evaluate to a bool.
evaluateBool :: Function P.Bool
evaluateBool = toFunction O.evaluateBool

-- | Evaluate to an array.
evaluateArray :: Function [Json]
evaluateArray = toFunction O.evaluateArray

-- | Evaluate to an object.
evaluateObject :: Function JsonObject
evaluateObject = toFunction O.evaluateObject

-- | Evaluate to a string.
evaluateString :: Function P.String
evaluateString = toFunction O.evaluateString