module BishBosh.Property.SelfValidating(
SelfValidating(..),
findErrors,
isValid,
isInvalid
) where
import Control.Arrow((***))
class SelfValidating a where
findInvalidity :: a -> [String]
instance SelfValidating a => SelfValidating [a] where
findInvalidity :: [a] -> [String]
findInvalidity = (a -> [String]) -> [a] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap a -> [String]
forall a. SelfValidating a => a -> [String]
findInvalidity
instance (SelfValidating a, SelfValidating b) => SelfValidating (a, b) where
findInvalidity :: (a, b) -> [String]
findInvalidity = ([String] -> [String] -> [String])
-> ([String], [String]) -> [String]
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
(++) (([String], [String]) -> [String])
-> ((a, b) -> ([String], [String])) -> (a, b) -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> [String]
forall a. SelfValidating a => a -> [String]
findInvalidity (a -> [String])
-> (b -> [String]) -> (a, b) -> ([String], [String])
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** b -> [String]
forall a. SelfValidating a => a -> [String]
findInvalidity)
isValid :: SelfValidating a => a -> Bool
isValid :: a -> Bool
isValid = [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([String] -> Bool) -> (a -> [String]) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> [String]
forall a. SelfValidating a => a -> [String]
findInvalidity
isInvalid :: SelfValidating a => a -> Bool
isInvalid :: a -> Bool
isInvalid = Bool -> Bool
not (Bool -> Bool) -> (a -> Bool) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
forall a. SelfValidating a => a -> Bool
isValid
findErrors :: [(selfValidator -> Bool, String)] -> selfValidator -> [String]
findErrors :: [(selfValidator -> Bool, String)] -> selfValidator -> [String]
findErrors [(selfValidator -> Bool, String)]
assocs selfValidator
selfValidator = [
String
errorMessage |
(selfValidator -> Bool
predicate, String
errorMessage) <- [(selfValidator -> Bool, String)]
assocs,
selfValidator -> Bool
predicate selfValidator
selfValidator
]