{-
- ``Util/ReOrd.hs''
-}
module Data.Ord.ReOrd where
-- |A handy constructor which just reverses the sense of an existing 'Ord'
-- instance.
newtype Ord a => ReverseOrd a = ReverseOrd a
deriving (Eq, Show)
instance (Ord a) => Ord (ReverseOrd a) where
compare (ReverseOrd a) (ReverseOrd b) = compare b a
-- |A type which provides an ad-hoc 'Ord' instance for the type it wraps.
-- It is the user's responsibility to make sure that it obeys all
-- relevant laws, also taking into account the fact that when 2 items
-- are compared, only one of their 'cmp' functions is invoked (the left one)
data ReOrd a =
ReOrd { cmp :: a -> a -> Ordering
, item :: a
}
instance Eq (ReOrd a) where
a == b = case cmp a (item a) (item b) of
EQ -> True
__ -> False
a /= b = case cmp a (item a) (item b) of
EQ -> False
__ -> True
instance Ord (ReOrd a) where
compare a b = cmp a (item a) (item b)