module Data.Vinyl.Validation where
import Data.Vinyl.Classes
import Control.Applicative
import Control.Monad.Identity
import Data.Monoid
data Result e a
= Failure e
| Success a
deriving (Show, Eq)
type Validator e = Identity ~> Result e
instance Functor (Result e) where
fmap f (Success x) = Success (f x)
fmap f (Failure e) = Failure e
instance Monoid e => Applicative (Result e) where
pure = Success
(Success f) <*> (Success x) = Success (f x)
(Failure e) <*> (Success x) = Failure e
(Success f) <*> (Failure e) = Failure e
(Failure e) <*> (Failure e') = Failure (e <> e')