Although cats-effect has some support for generating UUIDs, it is limited to the UUIDv4 pseudo-random type.
This library add support for the following types:
time-based | sortable | random | |
---|---|---|---|
UUID v1 | ✅ gregorian calendar |
||
UUID v4 | ✅ | ||
UUID v6 | ✅ gregorian calendar |
✅ | |
UUID v7 | ✅ unix epoch |
✅ |
Implementation based on this UUID RFC Draft
In addition to UUID, there is also support for TypeIDs. TypeIDs are a modern, type-safe extension of UUIDv7. This implementation is compatible with the 0.3.0 version of the specification
To use uuid4cats-effect in an existing SBT project with Scala 2.13 or a later version, add the following dependency to your
build.sbt
:
libraryDependencies += "tech.ant8e" %% "uuid4cats-effect" % "<version>"
uuid4cats-effect is published for Scala 2.13, and 3 on JVM and JS.
import cats.effect.IO
import cats.effect.unsafe.implicits.global
import tech.ant8e.uuid4cats.UUIDv6
import tech.ant8e.uuid4cats.UUIDUtil
import tech.ant8e.uuid4cats.TypeID
val ids = for {
generator <- UUIDv6.generator[IO]
typeIDGenerator <- TypeID.generator[IO]
uuid1 <- generator.uuid
uuid2 <- generator.uuid
typeid <- typeIDGenerator.typeid("myprefix")
ts = UUIDUtil.extractTimestamp(uuid1)
} yield (uuid1, uuid2, typeid.value, ts)
ids.unsafeRunSync()
val ids: cats.effect.IO[(java.util.UUID, java.util.UUID, String)] = IO(...)
val res1: (java.util.UUID, java.util.UUID, String) = (1ee22392-7669-6aa0-8000-ca7de6e5d540,1ee22392-766c-61b0-8000-422a97a9dbaa,myprefix_01h5a2ccabe0080m1hrkj0p0qp, Some(2024-04-28T11:10:44.501Z))
Uniqueness of generated time-based UUIDs is guaranteed when using the same generator. Collisions across generators are theoretically possible although unlikely.