{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE Safe #-}
module Valida.ValidationRule
( ValidationRule (..)
, vrule
) where
import Data.Typeable (Typeable)
import GHC.Generics (Generic)
import Valida.Validation (Validation (..))
newtype ValidationRule e a
= ValidationRule
(a -> Validation e ())
deriving (Typeable, (forall x. ValidationRule e a -> Rep (ValidationRule e a) x)
-> (forall x. Rep (ValidationRule e a) x -> ValidationRule e a)
-> Generic (ValidationRule e a)
forall x. Rep (ValidationRule e a) x -> ValidationRule e a
forall x. ValidationRule e a -> Rep (ValidationRule e a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall e a x. Rep (ValidationRule e a) x -> ValidationRule e a
forall e a x. ValidationRule e a -> Rep (ValidationRule e a) x
$cto :: forall e a x. Rep (ValidationRule e a) x -> ValidationRule e a
$cfrom :: forall e a x. ValidationRule e a -> Rep (ValidationRule e a) x
Generic)
instance Semigroup (ValidationRule e a) where
ValidationRule a -> Validation e ()
rl1 <> :: ValidationRule e a -> ValidationRule e a -> ValidationRule e a
<> ValidationRule a -> Validation e ()
rl2 = (a -> Validation e ()) -> ValidationRule e a
forall e a. (a -> Validation e ()) -> ValidationRule e a
ValidationRule
((a -> Validation e ()) -> ValidationRule e a)
-> (a -> Validation e ()) -> ValidationRule e a
forall a b. (a -> b) -> a -> b
$ \a
x -> case (a -> Validation e ()
rl1 a
x, a -> Validation e ()
rl2 a
x) of
(f :: Validation e ()
f@(Failure e
_), Validation e ()
_) -> Validation e ()
f
(Validation e ()
_, Validation e ()
b) -> Validation e ()
b
instance Monoid (ValidationRule e a) where
mempty :: ValidationRule e a
mempty = (a -> Validation e ()) -> ValidationRule e a
forall e a. (a -> Validation e ()) -> ValidationRule e a
ValidationRule ((a -> Validation e ()) -> ValidationRule e a)
-> (a -> Validation e ()) -> ValidationRule e a
forall a b. (a -> b) -> a -> b
$ Validation e () -> a -> Validation e ()
forall a b. a -> b -> a
const (Validation e () -> a -> Validation e ())
-> Validation e () -> a -> Validation e ()
forall a b. (a -> b) -> a -> b
$ () -> Validation e ()
forall e a. a -> Validation e a
Success ()
vrule :: (a -> Validation e ()) -> ValidationRule e a
vrule :: (a -> Validation e ()) -> ValidationRule e a
vrule = (a -> Validation e ()) -> ValidationRule e a
forall e a. (a -> Validation e ()) -> ValidationRule e a
ValidationRule