-
Notifications
You must be signed in to change notification settings - Fork 11
/
Equivalence.purs
32 lines (23 loc) · 1.14 KB
/
Equivalence.purs
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
module Data.Equivalence where
import Prelude
import Data.Comparison (Comparison(..))
import Data.Function (on)
import Data.Functor.Contravariant (class Contravariant)
import Data.Monoid (class Monoid)
import Data.Newtype (class Newtype)
-- | An adaptor allowing `>$<` to map over the inputs of an equivalence
-- | relation.
newtype Equivalence a = Equivalence (a -> a -> Boolean)
derive instance newtypeEquivalence :: Newtype (Equivalence a) _
instance contravariantEquivalence :: Contravariant Equivalence where
cmap f (Equivalence g) = Equivalence (g `on` f)
instance semigroupEquivalence :: Semigroup (Equivalence a) where
append (Equivalence p) (Equivalence q) = Equivalence (\a b -> p a b && q a b)
instance monoidEquivalence :: Monoid (Equivalence a) where
mempty = Equivalence (\_ _ -> true)
-- | The default equivalence relation for any values with an `Eq` instance.
defaultEquivalence :: forall a. Eq a => Equivalence a
defaultEquivalence = Equivalence eq
-- | An equivalence relation for any `Comparison`.
comparisonEquivalence :: forall a. Comparison a -> Equivalence a
comparisonEquivalence (Comparison p) = Equivalence (\a b -> p a b == EQ)