-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | A data-type like Either but with an accumulating Applicative
--   
--   
--   Several data-types like Either but with differing properties and
--   type-class instances.
--   
--   Library support is provided for those different representations,
--   include <a>lens</a>-related functions for converting between each and
--   abstracting over their similarities.
--   
--   <ul>
--   <li><a>AccValidation</a></li>
--   </ul>
--   
--   The <a>AccValidation</a> data type is isomorphic to <a>Either</a>, but
--   has an instance of <a>Applicative</a> that accumulates on the error
--   side. That is to say, if two (or more) errors are encountered, they
--   are appended using a <a>Semigroup</a> operation.
--   
--   As a consequence of this <a>Applicative</a> instance, there is no
--   corresponding <a>Bind</a> or <a>Monad</a> instance.
--   <a>AccValidation</a> is an example of, "An applicative functor that is
--   not a monad."
--   
--   <ul>
--   <li><a>Validation</a></li>
--   </ul>
--   
--   The <a>Validation</a> data type is isomorphic to <a>Either</a> and has
--   a <a>Monad</a> instance that does the same as <a>Either</a>. The only
--   difference to <a>Either</a> is the constructor names and surrounding
--   library support.
--   
--   <ul>
--   <li><a>ValidationT</a></li>
--   </ul>
--   
--   The <a>ValidationT</a> data type is the monad transformer for
--   <a>Validation</a>. An instance of <a>MonadTrans</a> is provided for
--   `(ValidationT err)`. Due to the arrangement of the <a>ValidationT</a>
--   type constructor, which permits a `MonadTrans instance, there is no
--   possible <a>Bifunctor</a> instance. Consequently, the
--   <a>ValidationB</a> data type provides a <a>Bifunctor</a> instance (but
--   not a <a>MonadTrans</a> instance). Library support is provided to
--   exploit the isomorphism to <a>ValidationB</a>.
--   
--   Note that since <a>AccValidation</a> is not a monad, there is also no
--   corresponding monad transformer for this data type.
--   
--   <ul>
--   <li><a>ValidationB</a></li>
--   </ul>
--   
--   The <a>ValidationB</a> data type is similar to the monad transformer
--   for <a>Validation</a> (<a>ValidationT</a>), however, due to the
--   arrangement of the <a>ValidationB</a> type constructor, which permits
--   a <a>Bifunctor</a> instance, there is no possible <a>MonadTrans</a>
--   instance. Consequently, the <a>ValidationT</a> data type provides a
--   <a>MonadTrans</a> instance (but not a <a>Bifunctor</a> instance).
--   Library support is provided to exploit the isomorphism to
--   <a>ValidationT</a>.
--   
--   <ul>
--   <li><a>Validation'</a></li>
--   </ul>
--   
--   The <a>Validation</a> err a` type-alias is equivalent to `ValidationT
--   err Identity a` and so is isomorphic to <a>Either</a> and others.
--   Libraries are supplied accordingly.
@package validation
@version 0.5.4


-- | Data types similar to <tt>Data.Either</tt> that are explicit about
--   failure and success.
module Data.Validation

-- | A value of the type <tt>err</tt> or <tt>a</tt>, however, the
--   <tt>Applicative</tt> instance accumulates values. This is witnessed by
--   the <tt>Semigroup</tt> context on the instance. <i>Note that there is
--   no Monad such that ap = (<a>*</a>).</i>
--   
--   <pre>
--   &gt;&gt;&gt; _Success # (+1) &lt;*&gt; _Success # 7 :: AccValidation String Int
--   AccSuccess 8
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; _Failure # ["f1"] &lt;*&gt; _Success # 7 :: AccValidation [String] Int
--   AccFailure ["f1"]
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; _Success # (+1) &lt;*&gt; _Failure # ["f2"] :: AccValidation [String] Int
--   AccFailure ["f2"]
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; _Failure # ["f1"] &lt;*&gt; _Failure # ["f2"] :: AccValidation [String] Int
--   AccFailure ["f1","f2"]
--   </pre>
data AccValidation err a
AccFailure :: err -> AccValidation err a
AccSuccess :: a -> AccValidation err a

-- | A value of the type <tt>err</tt> or <tt>a</tt> and isomorphic to
--   <tt>Data.Either</tt>.
--   
--   <pre>
--   &gt;&gt;&gt; _Success # (+1) &lt;*&gt; _Success # 7 :: Validation String Int
--   Success 8
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; _Failure # ["f1"] &lt;*&gt; _Success # 7 :: Validation [String] Int
--   Failure ["f1"]
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; _Success # (+1) &lt;*&gt; _Failure # ["f2"] :: Validation [String] Int
--   Failure ["f2"]
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; _Failure # ["f1"] &lt;*&gt; _Failure # ["f2"] :: Validation [String] Int
--   Failure ["f1"]
--   </pre>
data Validation err a
Failure :: err -> Validation err a
Success :: a -> Validation err a

-- | The transformer version of <tt>Validation</tt>.
data ValidationT err m a
ValidationT :: m (Validation err a) -> ValidationT err m a
[runValidationT] :: ValidationT err m a -> m (Validation err a)

-- | The bifunctor version of ValidationT
data ValidationB m err a
ValidationB :: m (Validation err a) -> ValidationB m err a
[runValidationB] :: ValidationB m err a -> m (Validation err a)
type Validation' err a = ValidationT err Identity a
_Failure :: Validate f => Prism (f e1 a) (f e2 a) e1 e2
_Success :: Validate f => Prism (f e a) (f e b) a b
class Validate f where _Validation' = _ValidationV' _AccValidation = _AccValidationV _Either = _EitherV
_Validation :: Validate f => Iso (f e a) (f g b) (Validation e a) (Validation g b)
_Validation' :: Validate f => Iso (f e a) (f g b) (Validation' e a) (Validation' g b)
_AccValidation :: Validate f => Iso (f e a) (f g b) (AccValidation e a) (AccValidation g b)
_Either :: Validate f => Iso (f e a) (f g b) (Either e a) (Either g b)
instance (Data.Data.Data a, Data.Data.Data err) => Data.Data.Data (Data.Validation.Validation err a)
instance (GHC.Show.Show a, GHC.Show.Show err) => GHC.Show.Show (Data.Validation.Validation err a)
instance (GHC.Classes.Ord a, GHC.Classes.Ord err) => GHC.Classes.Ord (Data.Validation.Validation err a)
instance (GHC.Classes.Eq a, GHC.Classes.Eq err) => GHC.Classes.Eq (Data.Validation.Validation err a)
instance (Data.Data.Data a, Data.Data.Data err) => Data.Data.Data (Data.Validation.AccValidation err a)
instance (GHC.Show.Show a, GHC.Show.Show err) => GHC.Show.Show (Data.Validation.AccValidation err a)
instance (GHC.Classes.Ord a, GHC.Classes.Ord err) => GHC.Classes.Ord (Data.Validation.AccValidation err a)
instance (GHC.Classes.Eq a, GHC.Classes.Eq err) => GHC.Classes.Eq (Data.Validation.AccValidation err a)
instance GHC.Base.Functor (Data.Validation.AccValidation err)
instance Data.Semigroup.Semigroup err => Data.Functor.Bind.Class.Apply (Data.Validation.AccValidation err)
instance Data.Semigroup.Semigroup err => GHC.Base.Applicative (Data.Validation.AccValidation err)
instance Data.Functor.Alt.Alt (Data.Validation.AccValidation err)
instance Data.Foldable.Foldable (Data.Validation.AccValidation err)
instance Data.Traversable.Traversable (Data.Validation.AccValidation err)
instance Data.Bifunctor.Bifunctor Data.Validation.AccValidation
instance Data.Bifoldable.Bifoldable Data.Validation.AccValidation
instance Data.Bitraversable.Bitraversable Data.Validation.AccValidation
instance Data.Semigroup.Semigroup e => Data.Semigroup.Semigroup (Data.Validation.AccValidation e a)
instance GHC.Base.Monoid e => GHC.Base.Monoid (Data.Validation.AccValidation e a)
instance GHC.Base.Functor (Data.Validation.Validation err)
instance Data.Functor.Bind.Class.Apply (Data.Validation.Validation err)
instance GHC.Base.Applicative (Data.Validation.Validation err)
instance Data.Functor.Alt.Alt (Data.Validation.Validation err)
instance Data.Foldable.Foldable (Data.Validation.Validation err)
instance Data.Traversable.Traversable (Data.Validation.Validation err)
instance Data.Bifunctor.Bifunctor Data.Validation.Validation
instance Data.Bifoldable.Bifoldable Data.Validation.Validation
instance Data.Bitraversable.Bitraversable Data.Validation.Validation
instance Data.Functor.Bind.Class.Bind (Data.Validation.Validation err)
instance GHC.Base.Monad (Data.Validation.Validation err)
instance GHC.Base.Functor m => GHC.Base.Functor (Data.Validation.ValidationT err m)
instance Data.Functor.Bind.Class.Apply m => Data.Functor.Bind.Class.Apply (Data.Validation.ValidationT err m)
instance GHC.Base.Applicative m => GHC.Base.Applicative (Data.Validation.ValidationT err m)
instance (GHC.Base.Functor m, GHC.Base.Monad m) => Data.Functor.Alt.Alt (Data.Validation.ValidationT err m)
instance Data.Foldable.Foldable m => Data.Foldable.Foldable (Data.Validation.ValidationT err m)
instance Data.Traversable.Traversable m => Data.Traversable.Traversable (Data.Validation.ValidationT err m)
instance (Data.Functor.Bind.Class.Apply m, GHC.Base.Monad m) => Data.Functor.Bind.Class.Bind (Data.Validation.ValidationT err m)
instance GHC.Base.Monad m => GHC.Base.Monad (Data.Validation.ValidationT err m)
instance Control.Monad.Trans.Class.MonadTrans (Data.Validation.ValidationT err)
instance GHC.Base.Functor m => GHC.Base.Functor (Data.Validation.ValidationB m err)
instance Data.Functor.Bind.Class.Apply m => Data.Functor.Bind.Class.Apply (Data.Validation.ValidationB m err)
instance GHC.Base.Applicative m => GHC.Base.Applicative (Data.Validation.ValidationB m err)
instance (GHC.Base.Functor m, GHC.Base.Monad m) => Data.Functor.Alt.Alt (Data.Validation.ValidationB m err)
instance Data.Foldable.Foldable m => Data.Foldable.Foldable (Data.Validation.ValidationB m err)
instance Data.Traversable.Traversable m => Data.Traversable.Traversable (Data.Validation.ValidationB m err)
instance GHC.Base.Functor m => Data.Bifunctor.Bifunctor (Data.Validation.ValidationB m)
instance Data.Foldable.Foldable m => Data.Bifoldable.Bifoldable (Data.Validation.ValidationB m)
instance Data.Traversable.Traversable m => Data.Bitraversable.Bitraversable (Data.Validation.ValidationB m)
instance (Data.Functor.Bind.Class.Apply m, GHC.Base.Monad m) => Data.Functor.Bind.Class.Bind (Data.Validation.ValidationB m err)
instance GHC.Base.Monad m => GHC.Base.Monad (Data.Validation.ValidationB m err)
instance Data.Validation.Validate Data.Validation.Validation
instance Data.Validation.Validate Data.Validation.AccValidation
instance Data.Validation.Validate Data.Either.Either
instance m ~ Data.Functor.Identity.Identity => Data.Validation.Validate (Data.Validation.ValidationB m)
instance Control.Lens.Iso.Swapped Data.Validation.AccValidation
instance Control.Lens.Iso.Swapped Data.Validation.Validation
instance GHC.Base.Functor f => Control.Lens.Iso.Swapped (Data.Validation.ValidationB f)
