From 415c88db0447bc94ae1624f28dcc4cc9b2d4be63 Mon Sep 17 00:00:00 2001 From: Stewart Stewart Date: Sun, 18 Dec 2016 17:03:16 -0500 Subject: scope SameId to Id --- src/main/scala/xyz/driver/core/core.scala | 52 +++++++++++++++---------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/src/main/scala/xyz/driver/core/core.scala b/src/main/scala/xyz/driver/core/core.scala index 1a6bdd7..c88c998 100644 --- a/src/main/scala/xyz/driver/core/core.scala +++ b/src/main/scala/xyz/driver/core/core.scala @@ -25,31 +25,6 @@ package object core { package core { - /** - * 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 extends LowPrioritySameIdImplicits { - def apply[A, B] = new SameId[A, B] {} - - implicit def reflexive[A]: A ~ A = SameId[A, A] - implicit def symmetric[A, B](implicit ab: A ~ B): B ~ A = SameId[B, A] - } - - trait LowPrioritySameIdImplicits { - protected type ~[A, B] = SameId[A, B] - - implicit def transitive[A, B, C](implicit ab: A ~ B, bc: B ~ C): A ~ C = SameId[A, C] - } - final case class Id[+Tag](value: String) extends AnyVal { @inline def length: Int = value.length override def toString: String = value @@ -59,11 +34,34 @@ 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 extends LowPrioritySameIdImplicits { + def apply[A, B] = new SameId[A, B] {} + + implicit def reflexive[A]: A ~ A = SameId[A, A] + implicit def symmetric[A, B](implicit ab: A ~ B): B ~ A = SameId[B, A] + } + + trait LowPrioritySameIdImplicits { + protected type ~[A, B] = SameId[A, B] + + implicit def transitive[A, B, C](implicit ab: A ~ B, bc: B ~ C): A ~ C = SameId[A, C] + } + implicit class InvariantIdOps[Tag](id: Id[Tag]) { def asId[T](implicit eq: SameId[Tag, T]): Id[T] = eq.convert(id) } - - def sameId[A, B] = SameId[A, B] } final case class Name[+Tag](value: String) extends AnyVal { -- cgit v1.2.3