module Network.Spata.DSL where
import Data.DList (singleton, toList, fromList)
import Control.Monad.Writer
import MPS.Env
import Prelude ()
import Data.Maybe
import Network.Spata.Type
import Control.Monad.Error
import MPS (empty)
guard :: Assoc -> Guardians -> Either String Assoc
guard xs m = execWriter m .toList .inject (Right xs) (>>=)
validate :: Guard -> [String]-> Guardians
validate f xs =
tell fromList xs.map f
train :: Task -> Guardians
train f = tell singleton f
inclusion_of :: Guard
inclusion_of = p (const True) ""
presence_of :: Guard
presence_of = p (empty > not) "should not be empty"
length_of :: (Integer -> Bool) -> Guard
length_of f = p (length > from_i > f) "should satisfy length properties"
p = predicate
predicate, p :: (String -> Bool) -> String -> Guard
predicate f s x xs =
case xs.lookup x of
Nothing -> Left x ++ " should exist"
Just y ->
if f y
then Right xs
else Left x ++ " " ++ s