penny-lib-0.14.0.0: lib/Penny/Lincoln/Equivalent.hs
module Penny.Lincoln.Equivalent where
import Data.Monoid ((<>))
-- | Comparisons for equivalency. Two items are equivalent if they
-- have the same semantic meaning, even if the data in the two items
-- is different.
class Equivalent a where
equivalent :: a -> a -> Bool
-- | Compares based on equivalency.
compareEv :: a -> a -> Ordering
(==~) :: Equivalent a => a -> a -> Bool
(==~) = equivalent
infix 4 ==~
instance (Equivalent a, Equivalent b) => Equivalent (a, b) where
equivalent (a1, b1) (a2, b2) = a1 ==~ a2 && b1 ==~ b2
compareEv (a1, b1) (a2, b2) =
compareEv a1 a2 <> compareEv b1 b2