module Data.AddBounds (AddBounds(..)) where
import Control.Applicative (pure,(<$>))
import Test.QuickCheck
import Test.QuickCheck.Checkers
data AddBounds a = MinBound | NoBound a | MaxBound
deriving (Eq , Read, Show)
instance Bounded (AddBounds a) where
minBound = MinBound
maxBound = MaxBound
instance Ord a => Ord (AddBounds a) where
MinBound <= _ = True
NoBound _ <= MinBound = False
NoBound a <= NoBound b = a <= b
NoBound _ <= MaxBound = True
MaxBound <= MaxBound = True
MaxBound <= _ = False
MinBound `min` _ = MinBound
_ `min` MinBound = MinBound
NoBound a `min` NoBound b = NoBound (a `min` b)
u `min` MaxBound = u
MaxBound `min` v = v
MinBound `max` v = v
u `max` MinBound = u
NoBound a `max` NoBound b = NoBound (a `max` b)
_ `max` MaxBound = MaxBound
MaxBound `max` _ = MaxBound
instance Arbitrary a => Arbitrary (AddBounds a) where
arbitrary = frequency [ (1 ,pure MinBound)
, (10, NoBound <$> arbitrary)
, (1 ,pure MaxBound) ]
coarbitrary MinBound = variant 0
coarbitrary (NoBound a) = variant 1 . coarbitrary a
coarbitrary MaxBound = variant 2
instance (EqProp a, Eq a) => EqProp (AddBounds a) where
NoBound a =-= NoBound b = a =-= b
u =-= v = u `eq` v