-
-
Notifications
You must be signed in to change notification settings - Fork 202
/
IsoLaws.scala
32 lines (22 loc) · 881 Bytes
/
IsoLaws.scala
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
package monocle.law
import monocle.Iso
import monocle.internal.IsEq
import cats.data.Const
import cats.Id
case class IsoLaws[S, A](iso: Iso[S, A]) {
import IsEq.syntax
def roundTripOneWay(s: S): IsEq[S] =
(iso.reverseGet _ compose iso.get)(s) <==> s
def roundTripOtherWay(a: A): IsEq[A] =
(iso.get _ compose iso.reverseGet)(a) <==> a
def modifyIdentity(s: S): IsEq[S] =
iso.modify(identity)(s) <==> s
def composeModify(s: S, f: A => A, g: A => A): IsEq[S] =
iso.modify(g)(iso.modify(f)(s)) <==> iso.modify(g compose f)(s)
def consistentReplaceModify(s: S, a: A): IsEq[S] =
iso.replace(a)(s) <==> iso.modify(_ => a)(s)
def consistentModifyModifyId(s: S, f: A => A): IsEq[S] =
iso.modify(f)(s) <==> iso.modifyF[Id](f)(s)
def consistentGetModifyId(s: S): IsEq[A] =
iso.get(s) <==> iso.modifyF[Const[A, *]](Const(_))(s).getConst
}