Skip to content

Commit b93f028

Browse files
authored
Add ReferentialEq[A] to Alley Cats (#3925)
* Add Eq.fromReferentialEquals * Revert "Add Eq.fromReferentialEquals" This reverts commit 63f7272. * Add ReferentialEq to Alley Cats * Add tests for ReferentialEq * Improved arbitrary
1 parent 3518aa0 commit b93f028

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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+
}

0 commit comments

Comments
 (0)