module Validation where import Test.QuickCheck (Arbitrary(..), frequency) import Test.QuickCheck.Checkers data Validation e a = Failure e | Success a deriving (Eq, Show) instance Functor (Validation e) where fmap f (Success x) = Success $ f x fmap f (Failure x) = Failure x instance Monoid e => Applicative (Validation e) where pure = Success (Failure x) <*> (Success _) = Failure x (Success _) <*> (Failure x) = Failure x (Failure f) <*> (Failure y) = Failure $ mappend f y (Success f) <*> (Success y) = Success $ f y instance (Arbitrary a, Arbitrary e) => Arbitrary (Validation e a) where arbitrary = frequency [(1, Failure <$> arbitrary), (5, Success <$> arbitrary)] instance (Eq a, Eq e) => EqProp (Validation e a) where (=-=) = eq