summaryrefslogtreecommitdiff
path: root/Haskell-book/18/Instance/src/PhhhbbtttEither.hs
blob: 0fc6accee11fe632864022181d8e16f2f5623dec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{-# 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