{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE Safe #-}
module Valida.Validator
( Selector
, Validator (..)
) where
import Data.List.NonEmpty (NonEmpty)
import Data.Typeable (Typeable)
import GHC.Generics (Generic)
import Valida.Validation (Validation (..))
type Selector a b = a -> b
newtype Validator e inp a = Validator { Validator e inp a -> inp -> Validation e a
runValidator :: inp -> Validation e a }
deriving (Typeable, (forall x. Validator e inp a -> Rep (Validator e inp a) x)
-> (forall x. Rep (Validator e inp a) x -> Validator e inp a)
-> Generic (Validator e inp a)
forall x. Rep (Validator e inp a) x -> Validator e inp a
forall x. Validator e inp a -> Rep (Validator e inp a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall e inp a x. Rep (Validator e inp a) x -> Validator e inp a
forall e inp a x. Validator e inp a -> Rep (Validator e inp a) x
$cto :: forall e inp a x. Rep (Validator e inp a) x -> Validator e inp a
$cfrom :: forall e inp a x. Validator e inp a -> Rep (Validator e inp a) x
Generic)
instance Functor (Validator e inp) where
fmap :: (a -> b) -> Validator e inp a -> Validator e inp b
fmap a -> b
f (Validator inp -> Validation e a
v) = (inp -> Validation e b) -> Validator e inp b
forall e inp a. (inp -> Validation e a) -> Validator e inp a
Validator ((inp -> Validation e b) -> Validator e inp b)
-> (inp -> Validation e b) -> Validator e inp b
forall a b. (a -> b) -> a -> b
$ (a -> b) -> Validation e a -> Validation e b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f (Validation e a -> Validation e b)
-> (inp -> Validation e a) -> inp -> Validation e b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. inp -> Validation e a
v
instance Semigroup e => Applicative (Validator e inp) where
{-# SPECIALIZE instance Applicative (Validator (NonEmpty err) inp) #-}
{-# SPECIALIZE instance Applicative (Validator () inp) #-}
{-# SPECIALIZE instance Applicative (Validator [err] inp) #-}
pure :: a -> Validator e inp a
pure = (inp -> Validation e a) -> Validator e inp a
forall e inp a. (inp -> Validation e a) -> Validator e inp a
Validator ((inp -> Validation e a) -> Validator e inp a)
-> (a -> inp -> Validation e a) -> a -> Validator e inp a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Validation e a -> inp -> Validation e a
forall a b. a -> b -> a
const (Validation e a -> inp -> Validation e a)
-> (a -> Validation e a) -> a -> inp -> Validation e a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Validation e a
forall e a. a -> Validation e a
Success
{-# INLINEABLE pure #-}
Validator inp -> Validation e (a -> b)
ff <*> :: Validator e inp (a -> b) -> Validator e inp a -> Validator e inp b
<*> Validator inp -> Validation e a
v = (inp -> Validation e b) -> Validator e inp b
forall e inp a. (inp -> Validation e a) -> Validator e inp a
Validator ((inp -> Validation e b) -> Validator e inp b)
-> (inp -> Validation e b) -> Validator e inp b
forall a b. (a -> b) -> a -> b
$ \inp
x -> inp -> Validation e (a -> b)
ff inp
x Validation e (a -> b) -> Validation e a -> Validation e b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> inp -> Validation e a
v inp
x
{-# INLINEABLE (<*>) #-}
instance Semigroup e => Semigroup (Validator e inp a) where
{-# SPECIALIZE instance Semigroup (Validator (NonEmpty err) inp a) #-}
{-# SPECIALIZE instance Semigroup (Validator () inp a) #-}
{-# SPECIALIZE instance Semigroup (Validator [err] inp a) #-}
Validator inp -> Validation e a
f <> :: Validator e inp a -> Validator e inp a -> Validator e inp a
<> Validator inp -> Validation e a
g = (inp -> Validation e a) -> Validator e inp a
forall e inp a. (inp -> Validation e a) -> Validator e inp a
Validator ((inp -> Validation e a) -> Validator e inp a)
-> (inp -> Validation e a) -> Validator e inp a
forall a b. (a -> b) -> a -> b
$ inp -> Validation e a
f (inp -> Validation e a)
-> (inp -> Validation e a) -> inp -> Validation e a
forall a. Semigroup a => a -> a -> a
<> inp -> Validation e a
g
{-# INLINEABLE (<>) #-}