File tree Expand file tree Collapse file tree 2 files changed +57
-0
lines changed
alleycats-core/src/main/scala/alleycats
alleycats-tests/shared/src/test/scala/alleycats/tests Expand file tree Collapse file tree 2 files changed +57
-0
lines changed Original file line number Diff line number Diff line change 1+ package alleycats
2+
3+ import cats .Eq
4+
5+ /**
6+ * An `Eq[A]` that delegates to referential equality (`eq`).
7+ * Note that it is not referentially transparent!
8+ */
9+ object ReferentialEq {
10+ def apply [A <: AnyRef ]: Eq [A ] = new Eq [A ] {
11+ def eqv (x : A , y : A ) = x eq y
12+ }
13+ }
Original file line number Diff line number Diff line change 1+ package alleycats .tests
2+
3+ import alleycats .ReferentialEq
4+ import cats .kernel .Eq
5+ import cats .kernel .laws .discipline ._
6+ import cats .kernel .laws .EqLaws
7+ import org .scalacheck .Arbitrary
8+ import org .scalacheck .Gen
9+ import org .scalacheck .Prop .forAll
10+ import org .typelevel .discipline .Laws
11+
12+ class ReferentialEqSuite extends AlleycatsSuite {
13+
14+ class ReferentialEqTests [A ](eq : Eq [A ]) extends Laws {
15+ def laws = EqLaws (eq)
16+
17+ def eqv (implicit arbA : Arbitrary [A ]): RuleSet = {
18+ implicit val eqA : Eq [A ] = laws.E
19+ new DefaultRuleSet (
20+ " referentialEq" ,
21+ None ,
22+ " reflexivity eq" -> forAll(laws.reflexivityEq _),
23+ " symmetry eq" -> forAll(laws.symmetryEq _),
24+ " transitivity eq" -> forAll(laws.transitivityEq _)
25+ )
26+ }
27+ }
28+
29+ implicit val arbObject : Arbitrary [Object ] =
30+ // with some probability we select from a small set of objects
31+ // otherwise make a totally new one
32+ // courtesy of @johnynek
33+ Arbitrary (
34+ Gen .oneOf(
35+ Gen .oneOf(List .fill(5 )(new Object )),
36+ Arbitrary .arbUnit.arbitrary.map(_ => new Object )
37+ )
38+ )
39+
40+ implicit val eqObject : Eq [Object ] = ReferentialEq [Object ]
41+
42+ checkAll(" ReferentialEq[Object]" , new ReferentialEqTests (ReferentialEq [Object ]).eqv)
43+
44+ }
You can’t perform that action at this time.
0 commit comments