diff options
author | Stewart Stewart <stewinsalot@gmail.com> | 2016-12-18 19:37:53 -0500 |
---|---|---|
committer | Stewart Stewart <stewinsalot@gmail.com> | 2016-12-18 19:37:53 -0500 |
commit | aca1f9c10b89499b073046d9b50fa455b675e20e (patch) | |
tree | 4bf8cb78b6c073b22c12011a4e6a17cad9e5f117 /src | |
parent | ea49093016f12989233bbb402f49b37b230e4c40 (diff) | |
download | driver-core-aca1f9c10b89499b073046d9b50fa455b675e20e.tar.gz driver-core-aca1f9c10b89499b073046d9b50fa455b675e20e.tar.bz2 driver-core-aca1f9c10b89499b073046d9b50fa455b675e20e.zip |
use implicit mappers for typed Id conversion
Diffstat (limited to 'src')
-rw-r--r-- | src/main/scala/xyz/driver/core/core.scala | 22 | ||||
-rw-r--r-- | src/test/scala/xyz/driver/core/CoreTest.scala | 15 |
2 files changed, 11 insertions, 26 deletions
diff --git a/src/main/scala/xyz/driver/core/core.scala b/src/main/scala/xyz/driver/core/core.scala index d1128b6..783150a 100644 --- a/src/main/scala/xyz/driver/core/core.scala +++ b/src/main/scala/xyz/driver/core/core.scala @@ -1,7 +1,6 @@ package xyz.driver import scalaz.Equal -import scala.annotation.implicitNotFound package object core { @@ -34,25 +33,8 @@ package core { implicit def idEqual[T]: Equal[Id[T]] = Equal.equal[Id[T]](_ == _) implicit def idOrdering[T]: Ordering[Id[T]] = Ordering.by[Id[T], String](_.value) - /** - * Evidence that Id[A] can be safely converted to Id[B]. - * e.g. `implicit val CaseId = Id.SameId[Case, CasesRow]` - * if `CaseId` is in scope, we can use either of: - * `casesRowId.asId[Case]` or `caseId.asId[CasesRow]` - * Override convert for custom Id conversions. - */ - @implicitNotFound("No evidence that ${A} has the same Id as ${B}") - sealed trait SameId[A, B] { - def convert(id: Id[A]): Id[B] = Id[B](id.value) - } - - object SameId { - def apply[A, B] = new SameId[A, B] {} - implicit def symmetric[A, B](implicit ab: SameId[A, B]): SameId[B, A] = SameId[B, A] - } - - implicit class InvariantIdOps[Tag](id: Id[Tag]) { - def asId[T](implicit eq: SameId[Tag, T]): Id[T] = eq.convert(id) + object Mapper { + def apply[A, B]: (Id[A] => Id[B]) = (id: Id[A]) => Id[B](id.value) } } diff --git a/src/test/scala/xyz/driver/core/CoreTest.scala b/src/test/scala/xyz/driver/core/CoreTest.scala index 1ccd707..72b6bc6 100644 --- a/src/test/scala/xyz/driver/core/CoreTest.scala +++ b/src/test/scala/xyz/driver/core/CoreTest.scala @@ -44,14 +44,17 @@ class CoreTest extends FlatSpec with Matchers with MockitoSugar { final case class Y(id: Id[Y]) final case class Z(id: Id[Z]) - implicit val xy = Id.SameId[X,Y] - implicit val yz = Id.SameId[Y,Z] + implicit val xy = Id.Mapper[X,Y] + implicit val yx = Id.Mapper[Y,X] + implicit val yz = Id.Mapper[Y,Z] + implicit val zy = Id.Mapper[Z,Y] val x = X(Id("0")) - val y = Y(x.id.asId[Y]) - val z = Z(y.id.asId[Z]) - val y2 = Y(z.id.asId[Y]) - val x2 = X(z.id.asId[Y].asId[X]) + val y = Y(x.id) + val z = Z(y.id) + val y2 = Y(z.id) + val x2 = X(y2.id) + x2 === x y2 === y } |