Skip to content

Commit

Permalink
Merge pull request #25 from llfrometa89/splitFFUID
Browse files Browse the repository at this point in the history
 Update docs and Refactor to split FFUUID into several type classes
  • Loading branch information
llfrometa89 authored Feb 12, 2019
2 parents 86f3265 + 810817b commit 05419ec
Show file tree
Hide file tree
Showing 9 changed files with 127 additions and 147 deletions.
15 changes: 14 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1 +1,14 @@



# 0.1.5

- Update docs
- Refactor to split FFUUID into several type classes [#25](https://github.com/pure4s/uuid4s/pull/)

# 0.1.4

- remove redundant UUID instances (thanks to [cde1gado](https://github.com/cde1gado)) [#24](https://github.com/pure4s/uuid4s/pull/24)

# 0.1.3

- Refactor to split FUUID into several type classes (thanks to [cde1gado](https://github.com/cde1gado)) [#23](https://github.com/pure4s/uuid4s/pull/23)
31 changes: 11 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
[comment]: # (Start Badges)

[![Build Status](https://travis-ci.org/pure4s/uuid4s.svg?branch=master)](https://travis-ci.org/pure4s/uuid4s)
[![Maven Central](https://img.shields.io/badge/maven%20central-0.1.3-green.svg)](https://oss.sonatype.org/#nexus-search;gav~org.pure4s~uuid4s*)
[![Maven Central](https://img.shields.io/badge/maven%20central-0.1.5-green.svg)](https://oss.sonatype.org/#nexus-search;gav~org.pure4s~uuid4s*)
[![codecov.io](https://codecov.io/gh/pure4s/uuid4s/branch/master/graph/badge.svg)](https://codecov.io/gh/pure4s/uuid4s)
[![Join the chat at https://gitter.im/pure4s-uuid4s/community](https://badges.gitter.im/pure4s-uuid4s/community.svg)](https://gitter.im/pure4s-uuid4s/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![GitHub Issues](https://img.shields.io/github/issues/pure4s/uuid4s.svg)](https://github.com/pure4s/uuid4s/issues)
Expand All @@ -20,7 +20,7 @@ Add the following to your `build.sbt`.

```scala
// For Scala 2.11, or 2.12
libraryDependencies += "org.pure4s" %% "uuid4s" % "0.1.3"
libraryDependencies += "org.pure4s" %% "uuid4s" % "0.1.5"
```

## Rationale
Expand All @@ -40,36 +40,27 @@ libraryDependencies += "org.pure4s" %% "uuid4s" % "0.1.3"

| Module name | Description | Version |
| -------------------- | ------------------------------------------------------------ | ------- |
| `uuid4s` | The core functionality of uuid4s | `0.1.3` |
| `uuid4s-fast` | Use fast uuid [fast-uuid][fast-uuid] | `0.1.3` |
| `uuid4s-circe` | Encode and decode HTTP entities with [Circe][circe] | `0.1.3` |
| `uuid4s-http4s` | Run your HTTP requests with http4s [http4s][http4s] | `0.1.3` |
| `uuid4s` | The core functionality of uuid4s | `0.1.5` |
| `uuid4s-fast` | Use fast uuid [fast-uuid][fast-uuid] | `0.1.5` |
| `uuid4s-circe` | Encode and decode HTTP entities with [Circe][circe] | `0.1.5` |

## Usage

Example:
```scala
import java.util.UUID
import cats.effect.IO
import cats.implicits._
import org.pure4s.uuid4s.FUUID
import org.pure4s.uuid4s.implicits._

object BasicExampleMain extends App {
object Main extends App {

//Parsing
val uuid1: UUID =
FUUID[IO].fromString("7cfb70a9-0764-4851-a28c-309393aea2eb").unsafeRunSync()
// Parsing
val uuid1: UUID = FUUID[IO].fromString("7cfb70a9-0764-4851-a28c-309393aea2eb").unsafeRunSync()
// uuid1: java.util.UUID = 7cfb70a9-0764-4851-a28c-309393aea2eb

//Generating
// Generating
val uuid2: UUID = FUUID[IO].random.unsafeRunSync()

//Comparing
val result1: Boolean = uuid2 < uuid1
val result2: Boolean = uuid2 <= uuid1
val result3: Boolean = uuid1 > uuid2
val result4: Boolean = uuid1 >= uuid2
val result5: Boolean = uuid1 === uuid1
// uuid2: java.util.UUID = f94e2de4-1c08-4189-9664-105954589e52
}
```

Expand Down
1 change: 1 addition & 0 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ lazy val V = new {
val kindProjectorVersion = "0.9.9"
val circeVersion = "0.11.0"
val fastUUIDVersion = "0.1"
val logger4sVersion = "0.1.1"
}

val noPublishSettings = Seq(
Expand Down
115 changes: 37 additions & 78 deletions docs/src/main/tut/examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,33 +9,36 @@ position: 3
```scala
import java.util.UUID
import cats.effect.IO
import cats.implicits._
import org.pure4s.uuid4s.FUUID
import org.pure4s.uuid4s.implicits._

object BasicExampleMain extends App {

//Parsing
val uuid1: UUID =
FUUID[IO].fromString("7cfb70a9-0764-4851-a28c-309393aea2eb").unsafeRunSync()
// Parsing
val uuid1: UUID = FUUID[IO].fromString("7cfb70a9-0764-4851-a28c-309393aea2eb").unsafeRunSync()
// uuid1: java.util.UUID = 7cfb70a9-0764-4851-a28c-309393aea2eb

//Generating
// Generating
val uuid2: UUID = FUUID[IO].random.unsafeRunSync()
// uuid2: java.util.UUID = f94e2de4-1c08-4189-9664-105954589e52
}
```

# Basic uuid4s-fast example
```scala
import java.util.UUID
import cats.effect.IO
import org.pure4s.uuid4s.FFUUID

object BasicFastExampleMain extends App {

// Parsing
val uuid1: UUID = FFUUID[IO].fromString("7cfb70a9-0764-4851-a28c-309393aea2eb").unsafeRunSync()
val uuid1: UUID = FUUID[IO].fromString("7cfb70a9-0764-4851-a28c-309393aea2eb").unsafeRunSync()
// uuid1: java.util.UUID = 7cfb70a9-0764-4851-a28c-309393aea2eb

//Comparing
val result1: Boolean = uuid2 < uuid1
val result2: Boolean = uuid2 <= uuid1
val result3: Boolean = uuid1 > uuid2
val result4: Boolean = uuid1 >= uuid2
val result5: Boolean = uuid1 === uuid1

println(s" -> uuid1 = $uuid1")
println(s" -> uuid2 = $uuid2")
println(s" --> uuid2 < uuid1 = $result1")
println(s" --> uuid2 <= uuid1 = $result2")
println(s" --> uuid1 > uuid2 = $result4")
println(s" --> uuid1 >= uuid2 = $result4")
println(s" --> uuid1 === uuid1 = $result5")
// Generating
val uuid2: UUID = FFUUID[IO].random.unsafeRunSync()
// uuid2: java.util.UUID = f94e2de4-1c08-4189-9664-105954589e52
}
```

Expand All @@ -46,27 +49,17 @@ import cats.effect.{IO, Sync}
import cats.implicits._
import org.pure4s.uuid4s.FUUID

case class ProfileResponse(userId: String,
email: String,
companyId: String,
companyName: String,
photo: String)

case class ProfileResponse(userId: String, email: String, companyId: String, companyName: String, photo: String)
case class Company(id: UUID, name: String)

case class User(id: UUID, email: String)

case class Profile(user: User, company: Company, photo: String)

class ProfileConverter {
def fromF[F[_]: Sync](profileResponse: ProfileResponse): F[Profile] = {
for {
userId <- FUUID[F].fromString(profileResponse.userId)
userId <- FUUID[F].fromString(profileResponse.userId)
companyId <- FUUID[F].fromString(profileResponse.companyId)
} yield
Profile(User(userId, profileResponse.email),
Company(companyId, profileResponse.companyName),
profileResponse.photo)
} yield Profile(User(userId, profileResponse.email), Company(companyId, profileResponse.companyName), profileResponse.photo)
}
}

Expand All @@ -82,61 +75,27 @@ class ProfileRestRepository[F[_]: Sync](converter: ProfileConverter)
* This method simulates the call external API Rest. Use Sync[F].delay when perform request to API Rest real
*/
def performRequest: F[Option[ProfileResponse]] =
Option(
ProfileResponse("7cfb70a9-0764-4851-a28c-309393aea2eb",
"[email protected]",
"e7f86fa0-ff91-47ba-baff-0954957af20f",
"pure4s",
"http://example.com/example.jpg")).pure[F]
Option(ProfileResponse("7cfb70a9-0764-4851-a28c-309393aea2eb",
"[email protected]",
"e7f86fa0-ff91-47ba-baff-0954957af20f",
"pure4s",
"http://example.com/example.jpg")).pure[F]

for {
maybeProfileResponse <- performRequest
maybeProfile <- maybeProfileResponse.traverse(converter.fromF[F])
maybeProfile <- maybeProfileResponse.traverse(converter.fromF[F])
} yield maybeProfile
}
}

object ComplexExampleMain extends App {
val converter = new ProfileConverter
val repository: ProfileRepository[IO] =
new ProfileRestRepository[IO](converter)
val maybeProfile =
repository.findByEmail("[email protected]").unsafeRunSync()
val repository: ProfileRepository[IO] = new ProfileRestRepository[IO](converter)
val maybeProfile = repository.findByEmail("[email protected]").unsafeRunSync()
println(s"-> maybeProfile = $maybeProfile")
}
```

# Basic uuid4s-fast example
```scala
import java.util.UUID

import cats.effect.IO
import cats.implicits._
import org.pure4s.uuid4s.FFUUID
import org.pure4s.uuid4s.implicits._

object BasicFastExampleMain extends App {

//Parsing
val uuid1: UUID =
FFUUID[IO].fromString("7cfb70a9-0764-4851-a28c-309393aea2eb").unsafeRunSync()

//Generating
val uuid2: UUID = FFUUID[IO].random.unsafeRunSync()

//Comparing
val result1: Boolean = uuid2 < uuid1
val result2: Boolean = uuid2 <= uuid1
val result3: Boolean = uuid1 > uuid2
val result4: Boolean = uuid1 >= uuid2
val result5: Boolean = uuid1 === uuid1

println(s" -> uuid1 = $uuid1")
println(s" -> uuid2 = $uuid2")
println(s" --> uuid2 < uuid1 = $result1")
println(s" --> uuid2 <= uuid1 = $result2")
println(s" --> uuid1 > uuid2 = $result4")
println(s" --> uuid1 >= uuid2 = $result4")
println(s" --> uuid1 === uuid1 = $result5")
//maybeProfile: Option[ProfileResponse] = Some(Profile(User(7cfb70a9-0764-4851-a28c-309393aea2eb,[email protected]),
Company(e7f86fa0-ff91-47ba-baff-0954957af20f,pure4s),
http://example.com/example.jpg))
}
```
64 changes: 25 additions & 39 deletions docs/src/main/tut/modules.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,71 +10,57 @@ position: 2
[http4s]: https://http4s.org/
[akka-http]: https://doc.akka.io/docs/akka-http/current/index.html?language=scala

# Circe Module([docs][circe])

To use uuid4s directly in you circe Json handling, you need add to your `build.sbt`:
# Fast UUID Module([docs][fast-uuid])
To use Fast UUID to for quickly and efficiently parsing and writing UUIDs, you need add to your `build.sbt`:

```scala
// For Scala 2.11, or 2.12
libraryDependencies += "org.pure4s" %% "uuid4s-circe" % "0.1.3"
libraryDependencies += "org.pure4s" %% "uuid4s-fast" % "0.1.5"
```

An example using this module:

```scala
import java.util.UUID
import cats.effect.IO
import org.pure4s.uuid4s.FUUID
import org.pure4s.uuid4s.circe._
import io.circe.syntax._
import org.pure4s.uuid4s.FFUUID

val circeUUID: UUID = FUUID[IO].fromString("f94e2de4-1c08-4189-9664-105954589e52").unsafeRunSync()
// circeUUID: java.util.UUID = f94e2de4-1c08-4189-9664-105954589e52
object Main extends App {

val circeUUIDJson = circeUUID.asJson
// circeUUIDJson: io.circe.Json = "f94e2de4-1c08-4189-9664-105954589e52"
// Parsing
val uuid1: UUID = FFUUID[IO].fromString("7cfb70a9-0764-4851-a28c-309393aea2eb").unsafeRunSync()
// uuid1: java.util.UUID = 7cfb70a9-0764-4851-a28c-309393aea2eb

val decode = circeUUIDJson.as[UUID]
// decode: io.circe.Decoder.Result[java.util.UUID] = Right(f94e2de4-1c08-4189-9664-105954589e52)
// Generating
val uuid2: UUID = FFUUID[IO].random.unsafeRunSync()
// uuid2: java.util.UUID = f94e2de4-1c08-4189-9664-105954589e52
}
```

# Fast UUID Module([docs][fast-uuid])
To use Fast UUID to for quickly and efficiently parsing and writing UUIDs, you need add to your `build.sbt`:
# Circe Module([docs][circe])

To use uuid4s directly in you circe Json handling, you need add to your `build.sbt`:

```scala
// For Scala 2.11, or 2.12
libraryDependencies += "org.pure4s" %% "uuid4s-fast" % "0.1.3"
libraryDependencies += "org.pure4s" %% "uuid4s-circe" % "0.1.5"
```

An example using this module:

```scala
import java.util.UUID
import cats.effect.IO
import cats.implicits._
import org.pure4s.uuid4s.FFUUID
import org.pure4s.uuid4s.implicits._

//Parsing
val uuid1: UUID =
FFUUID[IO].fromString("7cfb70a9-0764-4851-a28c-309393aea2eb").unsafeRunSync()

//Generating
val uuid2: UUID = FFUUID[IO].random.unsafeRunSync()

//Comparing
val result: Boolean = uuid2 < uuid1
```

# Http4s Module([docs][http4s])
To use uuid4s to define http4s paths, you need add to your `build.sbt`:
import org.pure4s.uuid4s.FUUID
import org.pure4s.uuid4s.circe._
import io.circe.syntax._

```scala
// For Scala 2.11, or 2.12
libraryDependencies += "org.pure4s" %% "uuid4s-http4s" % "0.1.3"
```
val circeUUID: UUID = FUUID[IO].fromString("f94e2de4-1c08-4189-9664-105954589e52").unsafeRunSync()
// circeUUID: java.util.UUID = f94e2de4-1c08-4189-9664-105954589e52

An example using this module:
val circeUUIDJson = circeUUID.asJson
// circeUUIDJson: io.circe.Json = "f94e2de4-1c08-4189-9664-105954589e52"

```scala
val decode = circeUUIDJson.as[UUID]
// decode: io.circe.Decoder.Result[java.util.UUID] = Right(f94e2de4-1c08-4189-9664-105954589e52)
```
2 changes: 0 additions & 2 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.5.1")
addSbtPlugin("com.47deg" % "sbt-microsites" % "0.7.27")
addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.8")
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.22")
addSbtPlugin("org.portable-scala" % "sbt-crossproject" % "0.3.1")
addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "0.3.1")
addSbtPlugin("com.lucidchart" % "sbt-scalafmt" % "1.15")
addSbtPlugin("org.tpolecat" % "tut-plugin" % "0.6.10")
addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.3")
Expand Down
16 changes: 9 additions & 7 deletions uuid4s-fast/src/main/scala/org/pure4s/uuid4s/FFUUID.scala
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
package org.pure4s.uuid4s

import cats.effect.Sync
import java.util.UUID
import com.eatthepath.uuid.FastUUID

import cats.effect.Sync

/**
* Tagless final implementation of a FFUUID.
*/
object FFUUID {

def apply[F[_]](implicit F: FUUID[F]): FUUID[F] = F
implicit def sync[F[_]: Sync]: FUUID[F] = new FUUID[F] {
override def fromString(value: String): F[UUID] = Sync[F].delay(FastUUID.parseUUID(value))
override def toString(uuid: UUID): F[String] = Sync[F].delay(FastUUID.toString(uuid))
override def fromUUID(uuid: UUID): F[UUID] = Sync[F].pure(uuid)
override def random: F[UUID] = Sync[F].delay(UUID.randomUUID)

implicit def instance[F[_]: Sync]: FUUID[F] = new FUUID[F] {
override def fromString(value: String): F[UUID] = FFromString[F].fromString(value)
override def fromUUID(uuid: UUID): F[UUID] = FromUUID[F].fromUUID(uuid)
override def toString(uuid: UUID): F[String] = FToString[F].toString(uuid)
override def random: F[UUID] = Random[F].random
}
}
Loading

0 comments on commit 05419ec

Please sign in to comment.