{-# LANGUAGE NoImplicitPrelude #-} module PhhhbbtttEither where import Prelude ( Monad(..) , Functor(..) , Applicative(..) , Eq(..) , ($) , Show(..) ) import Test.QuickCheck import Test.QuickCheck.Checkers data PhhhbbtttEither b a = Left a | Right b deriving (Eq, Show) instance Functor (PhhhbbtttEither b) where fmap f (Right x) = Right x fmap f (Left x) = Left $ f x instance Applicative (PhhhbbtttEither b) where pure x = Left x Right f <*> _ = Right f Left f <*> x = fmap f x instance Monad (PhhhbbtttEither b) where return = pure (Right x) >>= f = Right x (Left x) >>= f = f x instance (Arbitrary a, Arbitrary b) => Arbitrary (PhhhbbtttEither b a) where arbitrary = frequency [ (1, fmap Right arbitrary) , (1, fmap Left arbitrary) ] instance (Eq a, Eq b) => EqProp (PhhhbbtttEither b a) where (=-=) = eq