{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeOperators #-}
module Control.Validation.Check(
Unvalidated(..), unvalidated,
CheckResult(..),
checkResult, failsWith, failsNoMsg, passed, failed, checkResultToEither,
Check(..), Check', pass,
passOnRight, mapError, generalizeCheck,
validateBy, validateBy',
checking, checking',
test, (?~>),
test', (?>),
test_, (?~>>),
test'_,(?>>),
foldWithCheck, traverseWithCheck,
MultiCheck,
joinMultiCheck, mapErrorsWithInfo, constructorCheck,
hoist, contramap,
NP(..), DatatypeName, ConstructorName, FieldName
)
where
import Data.Kind (Type)
import Control.Validation.Internal.SOP(errMsgPOP)
import GHC.Generics as GHC(Generic)
import Generics.SOP as SOP(POP(..), unPOP, mapIK, hliftA2, unK, hcfoldMap, NP(..), Generic(..), Top, HasDatatypeInfo(..), DatatypeName, ConstructorName, FieldName, NS(..), SListI, hcexpand, hpure)
import Data.Proxy(Proxy(..))
import Control.Monad.Morph (MFunctor (..))
import Data.Functor ((<&>))
import Data.Functor.Contravariant (Contravariant (..),
Op (..))
import Data.Functor.Contravariant.Divisible (Decidable (..),
Divisible (..))
import Data.Functor.Identity (Identity (..))
import Data.Foldable (fold)
import Data.Monoid (Ap (..))
import Data.Sequence (Seq)
import qualified Data.Sequence as Seq (singleton)
newtype Unvalidated (a :: Type) =
MkUnvalidated { Unvalidated a -> a
unsafeValidate :: a }
deriving (Unvalidated a -> Unvalidated a -> Bool
(Unvalidated a -> Unvalidated a -> Bool)
-> (Unvalidated a -> Unvalidated a -> Bool) -> Eq (Unvalidated a)
forall a. Eq a => Unvalidated a -> Unvalidated a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Unvalidated a -> Unvalidated a -> Bool
$c/= :: forall a. Eq a => Unvalidated a -> Unvalidated a -> Bool
== :: Unvalidated a -> Unvalidated a -> Bool
$c== :: forall a. Eq a => Unvalidated a -> Unvalidated a -> Bool
Eq, Eq (Unvalidated a)
Eq (Unvalidated a) =>
(Unvalidated a -> Unvalidated a -> Ordering)
-> (Unvalidated a -> Unvalidated a -> Bool)
-> (Unvalidated a -> Unvalidated a -> Bool)
-> (Unvalidated a -> Unvalidated a -> Bool)
-> (Unvalidated a -> Unvalidated a -> Bool)
-> (Unvalidated a -> Unvalidated a -> Unvalidated a)
-> (Unvalidated a -> Unvalidated a -> Unvalidated a)
-> Ord (Unvalidated a)
Unvalidated a -> Unvalidated a -> Bool
Unvalidated a -> Unvalidated a -> Ordering
Unvalidated a -> Unvalidated a -> Unvalidated a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Unvalidated a)
forall a. Ord a => Unvalidated a -> Unvalidated a -> Bool
forall a. Ord a => Unvalidated a -> Unvalidated a -> Ordering
forall a. Ord a => Unvalidated a -> Unvalidated a -> Unvalidated a
min :: Unvalidated a -> Unvalidated a -> Unvalidated a
$cmin :: forall a. Ord a => Unvalidated a -> Unvalidated a -> Unvalidated a
max :: Unvalidated a -> Unvalidated a -> Unvalidated a
$cmax :: forall a. Ord a => Unvalidated a -> Unvalidated a -> Unvalidated a
>= :: Unvalidated a -> Unvalidated a -> Bool
$c>= :: forall a. Ord a => Unvalidated a -> Unvalidated a -> Bool
> :: Unvalidated a -> Unvalidated a -> Bool
$c> :: forall a. Ord a => Unvalidated a -> Unvalidated a -> Bool
<= :: Unvalidated a -> Unvalidated a -> Bool
$c<= :: forall a. Ord a => Unvalidated a -> Unvalidated a -> Bool
< :: Unvalidated a -> Unvalidated a -> Bool
$c< :: forall a. Ord a => Unvalidated a -> Unvalidated a -> Bool
compare :: Unvalidated a -> Unvalidated a -> Ordering
$ccompare :: forall a. Ord a => Unvalidated a -> Unvalidated a -> Ordering
$cp1Ord :: forall a. Ord a => Eq (Unvalidated a)
Ord, Int -> Unvalidated a -> ShowS
[Unvalidated a] -> ShowS
Unvalidated a -> String
(Int -> Unvalidated a -> ShowS)
-> (Unvalidated a -> String)
-> ([Unvalidated a] -> ShowS)
-> Show (Unvalidated a)
forall a. Show a => Int -> Unvalidated a -> ShowS
forall a. Show a => [Unvalidated a] -> ShowS
forall a. Show a => Unvalidated a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Unvalidated a] -> ShowS
$cshowList :: forall a. Show a => [Unvalidated a] -> ShowS
show :: Unvalidated a -> String
$cshow :: forall a. Show a => Unvalidated a -> String
showsPrec :: Int -> Unvalidated a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Unvalidated a -> ShowS
Show, a -> Unvalidated b -> Unvalidated a
(a -> b) -> Unvalidated a -> Unvalidated b
(forall a b. (a -> b) -> Unvalidated a -> Unvalidated b)
-> (forall a b. a -> Unvalidated b -> Unvalidated a)
-> Functor Unvalidated
forall a b. a -> Unvalidated b -> Unvalidated a
forall a b. (a -> b) -> Unvalidated a -> Unvalidated b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Unvalidated b -> Unvalidated a
$c<$ :: forall a b. a -> Unvalidated b -> Unvalidated a
fmap :: (a -> b) -> Unvalidated a -> Unvalidated b
$cfmap :: forall a b. (a -> b) -> Unvalidated a -> Unvalidated b
Functor, (forall x. Unvalidated a -> Rep (Unvalidated a) x)
-> (forall x. Rep (Unvalidated a) x -> Unvalidated a)
-> Generic (Unvalidated a)
forall x. Rep (Unvalidated a) x -> Unvalidated a
forall x. Unvalidated a -> Rep (Unvalidated a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Unvalidated a) x -> Unvalidated a
forall a x. Unvalidated a -> Rep (Unvalidated a) x
$cto :: forall a x. Rep (Unvalidated a) x -> Unvalidated a
$cfrom :: forall a x. Unvalidated a -> Rep (Unvalidated a) x
GHC.Generic)
deriving (Functor Unvalidated
a -> Unvalidated a
Functor Unvalidated =>
(forall a. a -> Unvalidated a)
-> (forall a b.
Unvalidated (a -> b) -> Unvalidated a -> Unvalidated b)
-> (forall a b c.
(a -> b -> c) -> Unvalidated a -> Unvalidated b -> Unvalidated c)
-> (forall a b. Unvalidated a -> Unvalidated b -> Unvalidated b)
-> (forall a b. Unvalidated a -> Unvalidated b -> Unvalidated a)
-> Applicative Unvalidated
Unvalidated a -> Unvalidated b -> Unvalidated b
Unvalidated a -> Unvalidated b -> Unvalidated a
Unvalidated (a -> b) -> Unvalidated a -> Unvalidated b
(a -> b -> c) -> Unvalidated a -> Unvalidated b -> Unvalidated c
forall a. a -> Unvalidated a
forall a b. Unvalidated a -> Unvalidated b -> Unvalidated a
forall a b. Unvalidated a -> Unvalidated b -> Unvalidated b
forall a b. Unvalidated (a -> b) -> Unvalidated a -> Unvalidated b
forall a b c.
(a -> b -> c) -> Unvalidated a -> Unvalidated b -> Unvalidated c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: Unvalidated a -> Unvalidated b -> Unvalidated a
$c<* :: forall a b. Unvalidated a -> Unvalidated b -> Unvalidated a
*> :: Unvalidated a -> Unvalidated b -> Unvalidated b
$c*> :: forall a b. Unvalidated a -> Unvalidated b -> Unvalidated b
liftA2 :: (a -> b -> c) -> Unvalidated a -> Unvalidated b -> Unvalidated c
$cliftA2 :: forall a b c.
(a -> b -> c) -> Unvalidated a -> Unvalidated b -> Unvalidated c
<*> :: Unvalidated (a -> b) -> Unvalidated a -> Unvalidated b
$c<*> :: forall a b. Unvalidated (a -> b) -> Unvalidated a -> Unvalidated b
pure :: a -> Unvalidated a
$cpure :: forall a. a -> Unvalidated a
$cp1Applicative :: Functor Unvalidated
Applicative, Applicative Unvalidated
a -> Unvalidated a
Applicative Unvalidated =>
(forall a b.
Unvalidated a -> (a -> Unvalidated b) -> Unvalidated b)
-> (forall a b. Unvalidated a -> Unvalidated b -> Unvalidated b)
-> (forall a. a -> Unvalidated a)
-> Monad Unvalidated
Unvalidated a -> (a -> Unvalidated b) -> Unvalidated b
Unvalidated a -> Unvalidated b -> Unvalidated b
forall a. a -> Unvalidated a
forall a b. Unvalidated a -> Unvalidated b -> Unvalidated b
forall a b. Unvalidated a -> (a -> Unvalidated b) -> Unvalidated b
forall (m :: * -> *).
Applicative m =>
(forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> Unvalidated a
$creturn :: forall a. a -> Unvalidated a
>> :: Unvalidated a -> Unvalidated b -> Unvalidated b
$c>> :: forall a b. Unvalidated a -> Unvalidated b -> Unvalidated b
>>= :: Unvalidated a -> (a -> Unvalidated b) -> Unvalidated b
$c>>= :: forall a b. Unvalidated a -> (a -> Unvalidated b) -> Unvalidated b
$cp1Monad :: Applicative Unvalidated
Monad) via Identity
{-# WARNING MkUnvalidated "Use 'unvalidated'. The data constructor 'Unvalidated' is not to be used in code and is only exported for use in deriving clauses" #-}
{-# INLINE unvalidated #-}
unvalidated :: a -> Unvalidated a
unvalidated :: a -> Unvalidated a
unvalidated = a -> Unvalidated a
forall a. a -> Unvalidated a
MkUnvalidated
data CheckResult (e :: Type)
= Passed
| Failed !(Seq e)
deriving (Int -> CheckResult e -> ShowS
[CheckResult e] -> ShowS
CheckResult e -> String
(Int -> CheckResult e -> ShowS)
-> (CheckResult e -> String)
-> ([CheckResult e] -> ShowS)
-> Show (CheckResult e)
forall e. Show e => Int -> CheckResult e -> ShowS
forall e. Show e => [CheckResult e] -> ShowS
forall e. Show e => CheckResult e -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CheckResult e] -> ShowS
$cshowList :: forall e. Show e => [CheckResult e] -> ShowS
show :: CheckResult e -> String
$cshow :: forall e. Show e => CheckResult e -> String
showsPrec :: Int -> CheckResult e -> ShowS
$cshowsPrec :: forall e. Show e => Int -> CheckResult e -> ShowS
Show, CheckResult e -> CheckResult e -> Bool
(CheckResult e -> CheckResult e -> Bool)
-> (CheckResult e -> CheckResult e -> Bool) -> Eq (CheckResult e)
forall e. Eq e => CheckResult e -> CheckResult e -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CheckResult e -> CheckResult e -> Bool
$c/= :: forall e. Eq e => CheckResult e -> CheckResult e -> Bool
== :: CheckResult e -> CheckResult e -> Bool
$c== :: forall e. Eq e => CheckResult e -> CheckResult e -> Bool
Eq, (forall x. CheckResult e -> Rep (CheckResult e) x)
-> (forall x. Rep (CheckResult e) x -> CheckResult e)
-> Generic (CheckResult e)
forall x. Rep (CheckResult e) x -> CheckResult e
forall x. CheckResult e -> Rep (CheckResult e) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall e x. Rep (CheckResult e) x -> CheckResult e
forall e x. CheckResult e -> Rep (CheckResult e) x
$cto :: forall e x. Rep (CheckResult e) x -> CheckResult e
$cfrom :: forall e x. CheckResult e -> Rep (CheckResult e) x
GHC.Generic, a -> CheckResult b -> CheckResult a
(a -> b) -> CheckResult a -> CheckResult b
(forall a b. (a -> b) -> CheckResult a -> CheckResult b)
-> (forall a b. a -> CheckResult b -> CheckResult a)
-> Functor CheckResult
forall a b. a -> CheckResult b -> CheckResult a
forall a b. (a -> b) -> CheckResult a -> CheckResult b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> CheckResult b -> CheckResult a
$c<$ :: forall a b. a -> CheckResult b -> CheckResult a
fmap :: (a -> b) -> CheckResult a -> CheckResult b
$cfmap :: forall a b. (a -> b) -> CheckResult a -> CheckResult b
Functor)
instance Semigroup (CheckResult e) where
Passed <> :: CheckResult e -> CheckResult e -> CheckResult e
<> x :: CheckResult e
x = CheckResult e
x
Failed s1 :: Seq e
s1 <> Passed = Seq e -> CheckResult e
forall e. Seq e -> CheckResult e
Failed Seq e
s1
Failed s1 :: Seq e
s1 <> Failed s2 :: Seq e
s2 = Seq e -> CheckResult e
forall e. Seq e -> CheckResult e
Failed (Seq e
s1 Seq e -> Seq e -> Seq e
forall a. Semigroup a => a -> a -> a
<> Seq e
s2)
instance Monoid (CheckResult e) where
mempty :: CheckResult e
mempty = CheckResult e
forall e. CheckResult e
Passed
failsWith :: e -> CheckResult e
failsWith :: e -> CheckResult e
failsWith = Seq e -> CheckResult e
forall e. Seq e -> CheckResult e
Failed (Seq e -> CheckResult e) -> (e -> Seq e) -> e -> CheckResult e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> Seq e
forall a. a -> Seq a
Seq.singleton
failsNoMsg :: CheckResult e
failsNoMsg :: CheckResult e
failsNoMsg = Seq e -> CheckResult e
forall e. Seq e -> CheckResult e
Failed Seq e
forall a. Monoid a => a
mempty
checkResult :: a -> (Seq e -> a) -> CheckResult e -> a
checkResult :: a -> (Seq e -> a) -> CheckResult e -> a
checkResult x :: a
x _ Passed = a
x
checkResult _ f :: Seq e -> a
f (Failed e :: Seq e
e) = Seq e -> a
f Seq e
e
passed, failed :: CheckResult e -> Bool
passed :: CheckResult e -> Bool
passed = Bool -> (Seq e -> Bool) -> CheckResult e -> Bool
forall a e. a -> (Seq e -> a) -> CheckResult e -> a
checkResult Bool
True (Bool -> Seq e -> Bool
forall a b. a -> b -> a
const Bool
False)
failed :: CheckResult e -> Bool
failed = Bool -> (Seq e -> Bool) -> CheckResult e -> Bool
forall a e. a -> (Seq e -> a) -> CheckResult e -> a
checkResult Bool
False (Bool -> Seq e -> Bool
forall a b. a -> b -> a
const Bool
True)
checkResultToEither :: a
-> CheckResult e
-> Either (Seq e) a
checkResultToEither :: a -> CheckResult e -> Either (Seq e) a
checkResultToEither x :: a
x = Either (Seq e) a
-> (Seq e -> Either (Seq e) a) -> CheckResult e -> Either (Seq e) a
forall a e. a -> (Seq e -> a) -> CheckResult e -> a
checkResult (a -> Either (Seq e) a
forall a b. b -> Either a b
Right a
x) Seq e -> Either (Seq e) a
forall a b. a -> Either a b
Left
newtype Check (e :: Type) (m :: Type -> Type) (a :: Type)
= Check { Check e m a -> Unvalidated a -> m (CheckResult e)
runCheck :: Unvalidated a -> m (CheckResult e) }
deriving ( Semigroup (Check e m a)
Check e m a
Semigroup (Check e m a) =>
Check e m a
-> (Check e m a -> Check e m a -> Check e m a)
-> ([Check e m a] -> Check e m a)
-> Monoid (Check e m a)
[Check e m a] -> Check e m a
Check e m a -> Check e m a -> Check e m a
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
forall e (m :: * -> *) a. Applicative m => Semigroup (Check e m a)
forall e (m :: * -> *) a. Applicative m => Check e m a
forall e (m :: * -> *) a.
Applicative m =>
[Check e m a] -> Check e m a
forall e (m :: * -> *) a.
Applicative m =>
Check e m a -> Check e m a -> Check e m a
mconcat :: [Check e m a] -> Check e m a
$cmconcat :: forall e (m :: * -> *) a.
Applicative m =>
[Check e m a] -> Check e m a
mappend :: Check e m a -> Check e m a -> Check e m a
$cmappend :: forall e (m :: * -> *) a.
Applicative m =>
Check e m a -> Check e m a -> Check e m a
mempty :: Check e m a
$cmempty :: forall e (m :: * -> *) a. Applicative m => Check e m a
$cp1Monoid :: forall e (m :: * -> *) a. Applicative m => Semigroup (Check e m a)
Monoid, b -> Check e m a -> Check e m a
NonEmpty (Check e m a) -> Check e m a
Check e m a -> Check e m a -> Check e m a
(Check e m a -> Check e m a -> Check e m a)
-> (NonEmpty (Check e m a) -> Check e m a)
-> (forall b. Integral b => b -> Check e m a -> Check e m a)
-> Semigroup (Check e m a)
forall b. Integral b => b -> Check e m a -> Check e m a
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
forall e (m :: * -> *) a.
Applicative m =>
NonEmpty (Check e m a) -> Check e m a
forall e (m :: * -> *) a.
Applicative m =>
Check e m a -> Check e m a -> Check e m a
forall e (m :: * -> *) a b.
(Applicative m, Integral b) =>
b -> Check e m a -> Check e m a
stimes :: b -> Check e m a -> Check e m a
$cstimes :: forall e (m :: * -> *) a b.
(Applicative m, Integral b) =>
b -> Check e m a -> Check e m a
sconcat :: NonEmpty (Check e m a) -> Check e m a
$csconcat :: forall e (m :: * -> *) a.
Applicative m =>
NonEmpty (Check e m a) -> Check e m a
<> :: Check e m a -> Check e m a -> Check e m a
$c<> :: forall e (m :: * -> *) a.
Applicative m =>
Check e m a -> Check e m a -> Check e m a
Semigroup ) via (a -> Ap m (CheckResult e))
deriving ( b -> Check e m b -> Check e m a
(a -> b) -> Check e m b -> Check e m a
(forall a b. (a -> b) -> Check e m b -> Check e m a)
-> (forall b a. b -> Check e m b -> Check e m a)
-> Contravariant (Check e m)
forall b a. b -> Check e m b -> Check e m a
forall a b. (a -> b) -> Check e m b -> Check e m a
forall e (m :: * -> *) b a. b -> Check e m b -> Check e m a
forall e (m :: * -> *) a b. (a -> b) -> Check e m b -> Check e m a
forall (f :: * -> *).
(forall a b. (a -> b) -> f b -> f a)
-> (forall b a. b -> f b -> f a) -> Contravariant f
>$ :: b -> Check e m b -> Check e m a
$c>$ :: forall e (m :: * -> *) b a. b -> Check e m b -> Check e m a
contramap :: (a -> b) -> Check e m b -> Check e m a
$ccontramap :: forall e (m :: * -> *) a b. (a -> b) -> Check e m b -> Check e m a
Contravariant, Contravariant (Check e m)
Check e m a
Contravariant (Check e m) =>
(forall a b c.
(a -> (b, c)) -> Check e m b -> Check e m c -> Check e m a)
-> (forall a. Check e m a) -> Divisible (Check e m)
(a -> (b, c)) -> Check e m b -> Check e m c -> Check e m a
forall a. Check e m a
forall a b c.
(a -> (b, c)) -> Check e m b -> Check e m c -> Check e m a
forall e (m :: * -> *). Applicative m => Contravariant (Check e m)
forall e (m :: * -> *) a. Applicative m => Check e m a
forall e (m :: * -> *) a b c.
Applicative m =>
(a -> (b, c)) -> Check e m b -> Check e m c -> Check e m a
forall (f :: * -> *).
Contravariant f =>
(forall a b c. (a -> (b, c)) -> f b -> f c -> f a)
-> (forall a. f a) -> Divisible f
conquer :: Check e m a
$cconquer :: forall e (m :: * -> *) a. Applicative m => Check e m a
divide :: (a -> (b, c)) -> Check e m b -> Check e m c -> Check e m a
$cdivide :: forall e (m :: * -> *) a b c.
Applicative m =>
(a -> (b, c)) -> Check e m b -> Check e m c -> Check e m a
$cp1Divisible :: forall e (m :: * -> *). Applicative m => Contravariant (Check e m)
Divisible, Divisible (Check e m)
Divisible (Check e m) =>
(forall a. (a -> Void) -> Check e m a)
-> (forall a b c.
(a -> Either b c) -> Check e m b -> Check e m c -> Check e m a)
-> Decidable (Check e m)
(a -> Void) -> Check e m a
(a -> Either b c) -> Check e m b -> Check e m c -> Check e m a
forall a. (a -> Void) -> Check e m a
forall a b c.
(a -> Either b c) -> Check e m b -> Check e m c -> Check e m a
forall e (m :: * -> *). Applicative m => Divisible (Check e m)
forall e (m :: * -> *) a.
Applicative m =>
(a -> Void) -> Check e m a
forall e (m :: * -> *) a b c.
Applicative m =>
(a -> Either b c) -> Check e m b -> Check e m c -> Check e m a
forall (f :: * -> *).
Divisible f =>
(forall a. (a -> Void) -> f a)
-> (forall a b c. (a -> Either b c) -> f b -> f c -> f a)
-> Decidable f
choose :: (a -> Either b c) -> Check e m b -> Check e m c -> Check e m a
$cchoose :: forall e (m :: * -> *) a b c.
Applicative m =>
(a -> Either b c) -> Check e m b -> Check e m c -> Check e m a
lose :: (a -> Void) -> Check e m a
$close :: forall e (m :: * -> *) a.
Applicative m =>
(a -> Void) -> Check e m a
$cp1Decidable :: forall e (m :: * -> *). Applicative m => Divisible (Check e m)
Decidable) via (Op (Ap m (CheckResult e)))
instance MFunctor (Check e) where
hoist :: (forall a. m a -> n a) -> Check e m b -> Check e n b
hoist f :: forall a. m a -> n a
f = ((Unvalidated b -> m (CheckResult e))
-> Unvalidated b -> n (CheckResult e))
-> Check e m b -> Check e n b
forall a (m :: * -> *) d b (n :: * -> *) e.
((Unvalidated a -> m (CheckResult d))
-> Unvalidated b -> n (CheckResult e))
-> Check d m a -> Check e n b
withCheck (m (CheckResult e) -> n (CheckResult e)
forall a. m a -> n a
f (m (CheckResult e) -> n (CheckResult e))
-> (Unvalidated b -> m (CheckResult e))
-> Unvalidated b
-> n (CheckResult e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.)
withCheck :: ( (Unvalidated a -> m (CheckResult d))
-> Unvalidated b -> n (CheckResult e))
-> Check d m a -> Check e n b
withCheck :: ((Unvalidated a -> m (CheckResult d))
-> Unvalidated b -> n (CheckResult e))
-> Check d m a -> Check e n b
withCheck f :: (Unvalidated a -> m (CheckResult d))
-> Unvalidated b -> n (CheckResult e)
f = (Unvalidated b -> n (CheckResult e)) -> Check e n b
forall e (m :: * -> *) a.
(Unvalidated a -> m (CheckResult e)) -> Check e m a
Check ((Unvalidated b -> n (CheckResult e)) -> Check e n b)
-> (Check d m a -> Unvalidated b -> n (CheckResult e))
-> Check d m a
-> Check e n b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Unvalidated a -> m (CheckResult d))
-> Unvalidated b -> n (CheckResult e)
f ((Unvalidated a -> m (CheckResult d))
-> Unvalidated b -> n (CheckResult e))
-> (Check d m a -> Unvalidated a -> m (CheckResult d))
-> Check d m a
-> Unvalidated b
-> n (CheckResult e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Check d m a -> Unvalidated a -> m (CheckResult d)
forall e (m :: * -> *) a.
Check e m a -> Unvalidated a -> m (CheckResult e)
runCheck
pass :: Applicative m => Check e m a
pass :: Check e m a
pass = Check e m a
forall a. Monoid a => a
mempty
validateBy :: Functor m => Check e m a -> Unvalidated a -> m (Either (Seq e) a)
validateBy :: Check e m a -> Unvalidated a -> m (Either (Seq e) a)
validateBy c :: Check e m a
c u :: Unvalidated a
u@(MkUnvalidated x :: a
x) = (CheckResult e -> Either (Seq e) a)
-> m (CheckResult e) -> m (Either (Seq e) a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a -> CheckResult e -> Either (Seq e) a
forall a e. a -> CheckResult e -> Either (Seq e) a
checkResultToEither a
x) (m (CheckResult e) -> m (Either (Seq e) a))
-> (Unvalidated a -> m (CheckResult e))
-> Unvalidated a
-> m (Either (Seq e) a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Check e m a -> Unvalidated a -> m (CheckResult e)
forall e (m :: * -> *) a.
Check e m a -> Unvalidated a -> m (CheckResult e)
runCheck Check e m a
c (Unvalidated a -> m (Either (Seq e) a))
-> Unvalidated a -> m (Either (Seq e) a)
forall a b. (a -> b) -> a -> b
$ Unvalidated a
u
validateBy' :: Check' e a -> Unvalidated a -> Either (Seq e) a
validateBy' :: Check' e a -> Unvalidated a -> Either (Seq e) a
validateBy' c :: Check' e a
c = Identity (Either (Seq e) a) -> Either (Seq e) a
forall a. Identity a -> a
runIdentity (Identity (Either (Seq e) a) -> Either (Seq e) a)
-> (Unvalidated a -> Identity (Either (Seq e) a))
-> Unvalidated a
-> Either (Seq e) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Check' e a -> Unvalidated a -> Identity (Either (Seq e) a)
forall (m :: * -> *) e a.
Functor m =>
Check e m a -> Unvalidated a -> m (Either (Seq e) a)
validateBy Check' e a
c
type Check' e = Check e Identity
generalizeCheck :: Applicative m => Check' e a -> Check e m a
generalizeCheck :: Check' e a -> Check e m a
generalizeCheck = (forall a. Identity a -> m a) -> Check' e a -> Check e m a
forall k (t :: (* -> *) -> k -> *) (m :: * -> *) (n :: * -> *)
(b :: k).
(MFunctor t, Monad m) =>
(forall a. m a -> n a) -> t m b -> t n b
hoist (a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> m a) -> (Identity a -> a) -> Identity a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Identity a -> a
forall a. Identity a -> a
runIdentity)
passOnRight :: Applicative m => (a -> Either b ()) -> Check e m b -> Check e m a
passOnRight :: (a -> Either b ()) -> Check e m b -> Check e m a
passOnRight f :: a -> Either b ()
f c :: Check e m b
c = (a -> Either b ()) -> Check e m b -> Check e m () -> Check e m a
forall (f :: * -> *) a b c.
Decidable f =>
(a -> Either b c) -> f b -> f c -> f a
choose a -> Either b ()
f Check e m b
c Check e m ()
forall a. Monoid a => a
mempty
mapError :: Functor m => (e -> e') -> Check e m a -> Check e' m a
mapError :: (e -> e') -> Check e m a -> Check e' m a
mapError f :: e -> e'
f = ((Unvalidated a -> m (CheckResult e))
-> Unvalidated a -> m (CheckResult e'))
-> Check e m a -> Check e' m a
forall a (m :: * -> *) d b (n :: * -> *) e.
((Unvalidated a -> m (CheckResult d))
-> Unvalidated b -> n (CheckResult e))
-> Check d m a -> Check e n b
withCheck ((CheckResult e -> CheckResult e')
-> m (CheckResult e) -> m (CheckResult e')
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((e -> e') -> CheckResult e -> CheckResult e'
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap e -> e'
f) (m (CheckResult e) -> m (CheckResult e'))
-> (Unvalidated a -> m (CheckResult e))
-> Unvalidated a
-> m (CheckResult e')
forall b c a. (b -> c) -> (a -> b) -> a -> c
.)
checking :: (a -> m (CheckResult e)) -> Check e m a
checking :: (a -> m (CheckResult e)) -> Check e m a
checking = (Unvalidated a -> m (CheckResult e)) -> Check e m a
forall e (m :: * -> *) a.
(Unvalidated a -> m (CheckResult e)) -> Check e m a
Check ((Unvalidated a -> m (CheckResult e)) -> Check e m a)
-> ((a -> m (CheckResult e)) -> Unvalidated a -> m (CheckResult e))
-> (a -> m (CheckResult e))
-> Check e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a -> m (CheckResult e))
-> (Unvalidated a -> a) -> Unvalidated a -> m (CheckResult e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Unvalidated a -> a
forall a. Unvalidated a -> a
unsafeValidate)
checking' :: (a -> CheckResult e) -> Check' e a
checking' :: (a -> CheckResult e) -> Check' e a
checking' = (a -> Identity (CheckResult e)) -> Check' e a
forall a (m :: * -> *) e. (a -> m (CheckResult e)) -> Check e m a
checking ((a -> Identity (CheckResult e)) -> Check' e a)
-> ((a -> CheckResult e) -> a -> Identity (CheckResult e))
-> (a -> CheckResult e)
-> Check' e a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CheckResult e -> Identity (CheckResult e)
forall a. a -> Identity a
Identity (CheckResult e -> Identity (CheckResult e))
-> (a -> CheckResult e) -> a -> Identity (CheckResult e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.)
test', (?>) :: Applicative m => (a -> Bool) -> (a -> e) -> Check e m a
test' :: (a -> Bool) -> (a -> e) -> Check e m a
test' p :: a -> Bool
p onErr :: a -> e
onErr = (Unvalidated a -> m (CheckResult e)) -> Check e m a
forall e (m :: * -> *) a.
(Unvalidated a -> m (CheckResult e)) -> Check e m a
Check ((Unvalidated a -> m (CheckResult e)) -> Check e m a)
-> (Unvalidated a -> m (CheckResult e)) -> Check e m a
forall a b. (a -> b) -> a -> b
$ \(MkUnvalidated x :: a
x) -> CheckResult e -> m (CheckResult e)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (CheckResult e -> m (CheckResult e))
-> CheckResult e -> m (CheckResult e)
forall a b. (a -> b) -> a -> b
$ if a -> Bool
p a
x
then CheckResult e
forall e. CheckResult e
Passed
else e -> CheckResult e
forall e. e -> CheckResult e
failsWith (a -> e
onErr a
x)
infix 7 `test'`
{-# INLINE (?>) #-}
?> :: (a -> Bool) -> (a -> e) -> Check e m a
(?>) = (a -> Bool) -> (a -> e) -> Check e m a
forall (m :: * -> *) a e.
Applicative m =>
(a -> Bool) -> (a -> e) -> Check e m a
test'
infix 7 ?>
{-# INLINE test'_ #-}
test'_,(?>>) :: Applicative m => (a -> Bool) -> e -> Check e m a
test'_ :: (a -> Bool) -> e -> Check e m a
test'_ p :: a -> Bool
p = (a -> Bool) -> (a -> e) -> Check e m a
forall (m :: * -> *) a e.
Applicative m =>
(a -> Bool) -> (a -> e) -> Check e m a
test' a -> Bool
p ((a -> e) -> Check e m a) -> (e -> a -> e) -> e -> Check e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> a -> e
forall a b. a -> b -> a
const
infix 7 `test'_`
{-# INLINE (?>>) #-}
?>> :: (a -> Bool) -> e -> Check e m a
(?>>) = (a -> Bool) -> e -> Check e m a
forall (m :: * -> *) a e.
Applicative m =>
(a -> Bool) -> e -> Check e m a
test'_
infix 7 ?>>
test, (?~>) :: Functor m => (a -> m Bool) -> (a -> e) -> Check e m a
test :: (a -> m Bool) -> (a -> e) -> Check e m a
test p :: a -> m Bool
p onErr :: a -> e
onErr = (Unvalidated a -> m (CheckResult e)) -> Check e m a
forall e (m :: * -> *) a.
(Unvalidated a -> m (CheckResult e)) -> Check e m a
Check ((Unvalidated a -> m (CheckResult e)) -> Check e m a)
-> (Unvalidated a -> m (CheckResult e)) -> Check e m a
forall a b. (a -> b) -> a -> b
$ \(MkUnvalidated x :: a
x) -> a -> m Bool
p a
x m Bool -> (Bool -> CheckResult e) -> m (CheckResult e)
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \case
True -> CheckResult e
forall e. CheckResult e
Passed
False -> e -> CheckResult e
forall e. e -> CheckResult e
failsWith (e -> CheckResult e) -> (a -> e) -> a -> CheckResult e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> e
onErr (a -> CheckResult e) -> a -> CheckResult e
forall a b. (a -> b) -> a -> b
$ a
x
infix 7 `test`
{-# INLINE (?~>) #-}
?~> :: (a -> m Bool) -> (a -> e) -> Check e m a
(?~>) = (a -> m Bool) -> (a -> e) -> Check e m a
forall (m :: * -> *) a e.
Functor m =>
(a -> m Bool) -> (a -> e) -> Check e m a
test
infix 7 ?~>
{-# INLINE test_ #-}
test_, (?~>>) :: Monad m => (a -> m Bool) -> e -> Check e m a
test_ :: (a -> m Bool) -> e -> Check e m a
test_ p :: a -> m Bool
p = (a -> m Bool) -> (a -> e) -> Check e m a
forall (m :: * -> *) a e.
Functor m =>
(a -> m Bool) -> (a -> e) -> Check e m a
test a -> m Bool
p ((a -> e) -> Check e m a) -> (e -> a -> e) -> e -> Check e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> a -> e
forall a b. a -> b -> a
const
infix 7 `test_`
{-# INLINE (?~>>) #-}
?~>> :: (a -> m Bool) -> e -> Check e m a
(?~>>) = (a -> m Bool) -> e -> Check e m a
forall (m :: * -> *) a e.
Monad m =>
(a -> m Bool) -> e -> Check e m a
test_
infix 7 ?~>>
foldWithCheck :: (Foldable f, Applicative m) => Check e m a -> Check e m (f a)
foldWithCheck :: Check e m a -> Check e m (f a)
foldWithCheck c :: Check e m a
c = (f a -> m (CheckResult e)) -> Check e m (f a)
forall a (m :: * -> *) e. (a -> m (CheckResult e)) -> Check e m a
checking ((f a -> m (CheckResult e)) -> Check e m (f a))
-> (f a -> m (CheckResult e)) -> Check e m (f a)
forall a b. (a -> b) -> a -> b
$ Ap m (CheckResult e) -> m (CheckResult e)
forall k (f :: k -> *) (a :: k). Ap f a -> f a
getAp (Ap m (CheckResult e) -> m (CheckResult e))
-> (f a -> Ap m (CheckResult e)) -> f a -> m (CheckResult e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Ap m (CheckResult e)) -> f a -> Ap m (CheckResult e)
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (m (CheckResult e) -> Ap m (CheckResult e)
forall k (f :: k -> *) (a :: k). f a -> Ap f a
Ap (m (CheckResult e) -> Ap m (CheckResult e))
-> (a -> m (CheckResult e)) -> a -> Ap m (CheckResult e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Check e m a -> Unvalidated a -> m (CheckResult e)
forall e (m :: * -> *) a.
Check e m a -> Unvalidated a -> m (CheckResult e)
runCheck Check e m a
c (Unvalidated a -> m (CheckResult e))
-> (a -> Unvalidated a) -> a -> m (CheckResult e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Unvalidated a
forall a. a -> Unvalidated a
unvalidated)
traverseWithCheck :: (Traversable t, Applicative m) => Check e m a -> Check e m (t a)
traverseWithCheck :: Check e m a -> Check e m (t a)
traverseWithCheck c :: Check e m a
c = (t a -> m (CheckResult e)) -> Check e m (t a)
forall a (m :: * -> *) e. (a -> m (CheckResult e)) -> Check e m a
checking ((t a -> m (CheckResult e)) -> Check e m (t a))
-> (t a -> m (CheckResult e)) -> Check e m (t a)
forall a b. (a -> b) -> a -> b
$ (t (CheckResult e) -> CheckResult e)
-> m (t (CheckResult e)) -> m (CheckResult e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap t (CheckResult e) -> CheckResult e
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold (m (t (CheckResult e)) -> m (CheckResult e))
-> (t a -> m (t (CheckResult e))) -> t a -> m (CheckResult e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> m (CheckResult e)) -> t a -> m (t (CheckResult e))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (Check e m a -> Unvalidated a -> m (CheckResult e)
forall e (m :: * -> *) a.
Check e m a -> Unvalidated a -> m (CheckResult e)
runCheck Check e m a
c (Unvalidated a -> m (CheckResult e))
-> (a -> Unvalidated a) -> a -> m (CheckResult e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Unvalidated a
forall a. a -> Unvalidated a
unvalidated)
type MultiCheck e m a = NP (NP (Check e m)) (Code a)
joinMultiCheck :: forall a m e. (Applicative m, SOP.Generic a) => MultiCheck e m a -> Check e m a
joinMultiCheck :: MultiCheck e m a -> Check e m a
joinMultiCheck checks :: MultiCheck e m a
checks = (a -> m (CheckResult e)) -> Check e m a
forall a (m :: * -> *) e. (a -> m (CheckResult e)) -> Check e m a
checking ((a -> m (CheckResult e)) -> Check e m a)
-> (a -> m (CheckResult e)) -> Check e m a
forall a b. (a -> b) -> a -> b
$ Ap m (CheckResult e) -> m (CheckResult e)
forall k (f :: k -> *) (a :: k). Ap f a -> f a
getAp
(Ap m (CheckResult e) -> m (CheckResult e))
-> (a -> Ap m (CheckResult e)) -> a -> m (CheckResult e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy Top
-> (forall a.
Top a =>
K (m (CheckResult e)) a -> Ap m (CheckResult e))
-> SOP (K (m (CheckResult e))) (Code a)
-> Ap m (CheckResult e)
forall k l (h :: (k -> *) -> l -> *) (c :: k -> Constraint)
(xs :: l) m (proxy :: (k -> Constraint) -> *) (f :: k -> *).
(HTraverse_ h, AllN h c xs, Monoid m) =>
proxy c -> (forall (a :: k). c a => f a -> m) -> h f xs -> m
hcfoldMap (Proxy Top
forall k (t :: k). Proxy t
Proxy @Top) (m (CheckResult e) -> Ap m (CheckResult e)
forall k (f :: k -> *) (a :: k). f a -> Ap f a
Ap (m (CheckResult e) -> Ap m (CheckResult e))
-> (K (m (CheckResult e)) a -> m (CheckResult e))
-> K (m (CheckResult e)) a
-> Ap m (CheckResult e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. K (m (CheckResult e)) a -> m (CheckResult e)
forall k a (b :: k). K a b -> a
unK)
(SOP (K (m (CheckResult e))) (Code a) -> Ap m (CheckResult e))
-> (a -> SOP (K (m (CheckResult e))) (Code a))
-> a
-> Ap m (CheckResult e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Check e m a -> I a -> K (m (CheckResult e)) a)
-> Prod SOP (Check e m) (Code a)
-> SOP I (Code a)
-> SOP (K (m (CheckResult e))) (Code a)
forall k l (h :: (k -> *) -> l -> *) (xs :: l) (f :: k -> *)
(f' :: k -> *) (f'' :: k -> *).
(SListIN (Prod h) xs, HAp h, HAp (Prod h)) =>
(forall (a :: k). f a -> f' a -> f'' a)
-> Prod h f xs -> h f' xs -> h f'' xs
hliftA2 (\c :: Check e m a
c -> (a -> m (CheckResult e)) -> I a -> K (m (CheckResult e)) a
forall k a b (c :: k). (a -> b) -> I a -> K b c
mapIK ((a -> m (CheckResult e)) -> I a -> K (m (CheckResult e)) a)
-> (a -> m (CheckResult e)) -> I a -> K (m (CheckResult e)) a
forall a b. (a -> b) -> a -> b
$ Check e m a -> Unvalidated a -> m (CheckResult e)
forall e (m :: * -> *) a.
Check e m a -> Unvalidated a -> m (CheckResult e)
runCheck Check e m a
c (Unvalidated a -> m (CheckResult e))
-> (a -> Unvalidated a) -> a -> m (CheckResult e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Unvalidated a
forall a. a -> Unvalidated a
unvalidated)
(MultiCheck e m a -> Prod SOP (Check e m) (Code a)
forall k (f :: k -> *) (xss :: [[k]]). NP (NP f) xss -> POP f xss
POP (MultiCheck e m a -> Prod SOP (Check e m) (Code a))
-> MultiCheck e m a -> Prod SOP (Check e m) (Code a)
forall a b. (a -> b) -> a -> b
$ MultiCheck e m a
checks)
(SOP I (Code a) -> SOP (K (m (CheckResult e))) (Code a))
-> (a -> SOP I (Code a))
-> a
-> SOP (K (m (CheckResult e))) (Code a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> SOP I (Code a)
forall a. Generic a => a -> Rep a
from
mapErrorsWithInfo :: forall e e' a m. (Functor m, HasDatatypeInfo a) => Proxy a -> (DatatypeName -> ConstructorName -> FieldName -> e -> e') -> MultiCheck e m a -> MultiCheck e' m a
mapErrorsWithInfo :: Proxy a
-> (String -> String -> String -> e -> e')
-> MultiCheck e m a
-> MultiCheck e' m a
mapErrorsWithInfo p :: Proxy a
p f :: String -> String -> String -> e -> e'
f = POP (Check e' m) (Code a) -> MultiCheck e' m a
forall k (f :: k -> *) (xss :: [[k]]). POP f xss -> NP (NP f) xss
unPOP (POP (Check e' m) (Code a) -> MultiCheck e' m a)
-> (MultiCheck e m a -> POP (Check e' m) (Code a))
-> MultiCheck e m a
-> MultiCheck e' m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. K (e -> e') a -> Check e m a -> Check e' m a)
-> Prod POP (K (e -> e')) (Code a)
-> POP (Check e m) (Code a)
-> POP (Check e' m) (Code a)
forall k l (h :: (k -> *) -> l -> *) (xs :: l) (f :: k -> *)
(f' :: k -> *) (f'' :: k -> *).
(SListIN (Prod h) xs, HAp h, HAp (Prod h)) =>
(forall (a :: k). f a -> f' a -> f'' a)
-> Prod h f xs -> h f' xs -> h f'' xs
hliftA2 ((e -> e') -> Check e m a -> Check e' m a
forall (m :: * -> *) e e' a.
Functor m =>
(e -> e') -> Check e m a -> Check e' m a
mapError ((e -> e') -> Check e m a -> Check e' m a)
-> (K (e -> e') a -> e -> e')
-> K (e -> e') a
-> Check e m a
-> Check e' m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. K (e -> e') a -> e -> e'
forall k a (b :: k). K a b -> a
unK) (Proxy a
-> (String -> String -> String -> e -> e')
-> POP (K (e -> e')) (Code a)
forall e a e'.
HasDatatypeInfo a =>
Proxy a
-> (String -> String -> String -> e -> e')
-> POP (K (e -> e')) (Code a)
errMsgPOP Proxy a
p String -> String -> String -> e -> e'
f) (POP (Check e m) (Code a) -> POP (Check e' m) (Code a))
-> (MultiCheck e m a -> POP (Check e m) (Code a))
-> MultiCheck e m a
-> POP (Check e' m) (Code a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MultiCheck e m a -> POP (Check e m) (Code a)
forall k (f :: k -> *) (xss :: [[k]]). NP (NP f) xss -> POP f xss
POP
constructorCheck :: forall a m e xs. (Applicative m, SOP.Generic a)
=> (NP (Check e m) xs -> NS (NP (Check e m)) (Code a))
-> NP (Check e m) xs
-> Check e m a
constructorCheck :: (NP (Check e m) xs -> NS (NP (Check e m)) (Code a))
-> NP (Check e m) xs -> Check e m a
constructorCheck f :: NP (Check e m) xs -> NS (NP (Check e m)) (Code a)
f ps :: NP (Check e m) xs
ps = NP (NP (Check e m)) (Code a) -> Check e m a
forall a (m :: * -> *) e.
(Applicative m, Generic a) =>
MultiCheck e m a -> Check e m a
joinMultiCheck (NP (NP (Check e m)) (Code a) -> Check e m a)
-> (NP (Check e m) xs -> NP (NP (Check e m)) (Code a))
-> NP (Check e m) xs
-> Check e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy SListI
-> (forall (x :: [*]). SListI x => NP (Check e m) x)
-> NS (NP (Check e m)) (Code a)
-> Prod NS (NP (Check e m)) (Code a)
forall k l (h :: (k -> *) -> l -> *) (c :: k -> Constraint)
(xs :: l) (proxy :: (k -> Constraint) -> *) (f :: k -> *).
(HExpand h, AllN (Prod h) c xs) =>
proxy c -> (forall (x :: k). c x => f x) -> h f xs -> Prod h f xs
hcexpand (Proxy SListI
forall k (t :: k). Proxy t
Proxy @SListI) ((forall a. Check e m a) -> NP (Check e m) x
forall k l (h :: (k -> *) -> l -> *) (xs :: l) (f :: k -> *).
(HPure h, SListIN h xs) =>
(forall (a :: k). f a) -> h f xs
hpure forall a. Check e m a
forall a. Monoid a => a
mempty) (NS (NP (Check e m)) (Code a) -> NP (NP (Check e m)) (Code a))
-> (NP (Check e m) xs -> NS (NP (Check e m)) (Code a))
-> NP (Check e m) xs
-> NP (NP (Check e m)) (Code a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NP (Check e m) xs -> NS (NP (Check e m)) (Code a)
f (NP (Check e m) xs -> Check e m a)
-> NP (Check e m) xs -> Check e m a
forall a b. (a -> b) -> a -> b
$ NP (Check e m) xs
ps