{-# OPTIONS_GHC -Wno-unused-imports #-}
module JsonLogic.Operation.Utils where
import qualified Data.Map as M
import JsonLogic.Json
import JsonLogic.Type
import Text.Read
indexWithJson :: Rule -> Data -> Maybe Json
indexWithJson :: Rule -> Rule -> Maybe Rule
indexWithJson (JsonString String
indexString) = [String] -> Rule -> Maybe Rule
indexWithString (String -> [String]
splitOnPeriod String
indexString)
indexWithJson (JsonNumber Double
indexNumber) = [String] -> Rule -> Maybe Rule
indexWithString [Int -> String
forall a. Show a => a -> String
show (Double -> Int
forall a b. (RealFrac a, Integral b) => a -> b
floor Double
indexNumber :: Int)]
indexWithJson Rule
_ = Maybe Rule -> Rule -> Maybe Rule
forall a b. a -> b -> a
const Maybe Rule
forall a. Maybe a
Nothing
indexWithString :: [String] -> Data -> Maybe Json
indexWithString :: [String] -> Rule -> Maybe Rule
indexWithString [] Rule
vars = Rule -> Maybe Rule
forall a. a -> Maybe a
Just Rule
vars
indexWithString [String
x] (JsonString String
s) =
String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
x Maybe Int -> (Int -> Maybe Char) -> Maybe Char
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> Int -> Maybe Char
forall a. [a] -> Int -> Maybe a
(!?) String
s Maybe Char -> (Char -> Maybe Rule) -> Maybe Rule
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Rule -> Maybe Rule
forall a. a -> Maybe a
Just (Rule -> Maybe Rule) -> (Char -> Rule) -> Char -> Maybe Rule
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Rule
JsonString (String -> Rule) -> (Char -> String) -> Char -> Rule
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> String
forall a. a -> [a]
singleton
indexWithString (String
x : [String]
xs) (JsonArray [Rule]
js) =
String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
x Maybe Int -> (Int -> Maybe Rule) -> Maybe Rule
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Rule] -> Int -> Maybe Rule
forall a. [a] -> Int -> Maybe a
(!?) [Rule]
js Maybe Rule -> (Rule -> Maybe Rule) -> Maybe Rule
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [String] -> Rule -> Maybe Rule
indexWithString [String]
xs
indexWithString (String
x : [String]
xs) (JsonObject JsonObject
o) = String -> JsonObject -> Maybe Rule
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup String
x JsonObject
o Maybe Rule -> (Rule -> Maybe Rule) -> Maybe Rule
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [String] -> Rule -> Maybe Rule
indexWithString [String]
xs
indexWithString [String]
_ Rule
_ = Maybe Rule
forall a. Maybe a
Nothing
splitOnPeriod :: String -> [String]
splitOnPeriod :: String -> [String]
splitOnPeriod String
"" = []
splitOnPeriod String
s = case (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Char
'.' Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
Prelude.==) String
s of
String
"." -> []
String
s' -> String
w String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String -> [String]
splitOnPeriod String
s''
where
(String
w, String
s'') = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Char
'.' Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
Prelude.==) String
s'
(!?) :: [a] -> Int -> Maybe a
[a]
_ !? :: [a] -> Int -> Maybe a
!? Int
n | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = Maybe a
forall a. Maybe a
Nothing
[] !? Int
_ = Maybe a
forall a. Maybe a
Nothing
(a
x : [a]
_) !? Int
0 = a -> Maybe a
forall a. a -> Maybe a
Just a
x
(a
_ : [a]
xs) !? Int
n = [a]
xs [a] -> Int -> Maybe a
forall a. [a] -> Int -> Maybe a
!? (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
evaluateUnaryArgument :: Data -> Data
evaluateUnaryArgument :: Rule -> Rule
evaluateUnaryArgument (JsonArray [Rule
json]) = Rule
json
evaluateUnaryArgument Rule
json = Rule
json
singleton :: a -> [a]
singleton :: a -> [a]
singleton a
x = [a
x]