aboutsummaryrefslogtreecommitdiff
path: root/core-types/src/main/scala/xyz/driver/core/core.scala
diff options
context:
space:
mode:
Diffstat (limited to 'core-types/src/main/scala/xyz/driver/core/core.scala')
-rw-r--r--core-types/src/main/scala/xyz/driver/core/core.scala52
1 files changed, 51 insertions, 1 deletions
diff --git a/core-types/src/main/scala/xyz/driver/core/core.scala b/core-types/src/main/scala/xyz/driver/core/core.scala
index 67ac5ee..d88bf09 100644
--- a/core-types/src/main/scala/xyz/driver/core/core.scala
+++ b/core-types/src/main/scala/xyz/driver/core/core.scala
@@ -54,7 +54,15 @@ package object core {
package core {
- final case class Id[+Tag](value: String) extends AnyVal {
+ import java.util.UUID
+
+ sealed trait GenericId[+Tag, IdType] extends Any {
+ def value: IdType
+ def length: Int
+ def toString: String
+ }
+
+ final case class Id[+Tag](value: String) extends AnyVal with GenericId[Tag, String] {
@inline def length: Int = value.length
override def toString: String = value
}
@@ -75,6 +83,48 @@ package core {
implicit def convertER[E, R](id: Id[E])(implicit mapper: Mapper[E, R]): Id[R] = mapper[R](id)
}
+ final case class UuidId[+Tag](value: UUID) extends AnyVal with GenericId[Tag, UUID] {
+ @inline def length: Int = value.toString.length
+ override def toString: String = value.toString
+ }
+
+ @SuppressWarnings(Array("org.wartremover.warts.ImplicitConversion"))
+ object UuidId {
+ implicit def idEqual[T]: Equal[UuidId[T]] = Equal.equal[UuidId[T]](_ == _)
+ implicit def idOrdering[T]: Ordering[UuidId[T]] = Ordering.by[UuidId[T], UUID](_.value)
+
+ sealed class Mapper[E, R] {
+ def apply[T >: E](id: UuidId[R]): UuidId[T] = UuidId[E](id.value)
+ def apply[T >: R](id: UuidId[E])(implicit dummy: DummyImplicit): UuidId[T] = UuidId[R](id.value)
+ }
+ object Mapper {
+ def apply[E, R] = new Mapper[E, R]
+ }
+ implicit def convertRE[R, E](id: UuidId[R])(implicit mapper: Mapper[E, R]): UuidId[E] = mapper[E](id)
+ implicit def convertER[E, R](id: UuidId[E])(implicit mapper: Mapper[E, R]): UuidId[R] = mapper[R](id)
+ }
+
+ final case class NumericId[+Tag](value: Long) extends AnyVal with GenericId[Tag, Long] {
+ @inline def length: Int = value.toString.length
+ override def toString: String = value.toString
+ }
+
+ @SuppressWarnings(Array("org.wartremover.warts.ImplicitConversion"))
+ object NumericId {
+ implicit def idEqual[T]: Equal[NumericId[T]] = Equal.equal[NumericId[T]](_ == _)
+ implicit def idOrdering[T]: Ordering[NumericId[T]] = Ordering.by[NumericId[T], Long](_.value)
+
+ sealed class Mapper[E, R] {
+ def apply[T >: E](id: NumericId[R]): NumericId[T] = NumericId[E](id.value)
+ def apply[T >: R](id: NumericId[E])(implicit dummy: DummyImplicit): NumericId[T] = NumericId[R](id.value)
+ }
+ object Mapper {
+ def apply[E, R] = new Mapper[E, R]
+ }
+ implicit def convertRE[R, E](id: NumericId[R])(implicit mapper: Mapper[E, R]): NumericId[E] = mapper[E](id)
+ implicit def convertER[E, R](id: NumericId[E])(implicit mapper: Mapper[E, R]): NumericId[R] = mapper[R](id)
+ }
+
final case class Name[+Tag](value: String) extends AnyVal {
@inline def length: Int = value.length
override def toString: String = value