Skip to main content

Render

Module​

  • The core module:

    "io.kevinlee" %% "extras-render" % "0.57.0"
  • For refined library:

    "io.kevinlee" %% "extras-render-refined" % "0.57.0"

or for Scala.js:

  • The core module:

    "io.kevinlee" %%% "extras-render" % "0.57.0"
  • For refined:

    "io.kevinlee" %%% "extras-render-refined" % "0.57.0"

Render type-class​

It is to provider render functionality to render a given type A into String.

trait Render[A] {
def render(a: A): String
}

Usage Example​

import extras.render.Render

final case class Foo(id: Int, name: String)
object Foo {
implicit val fooRender: Render[Foo] = new Render[Foo] {
def render(foo: Foo): String =
s"ID=${foo.id.toString} / Name=${foo.name}"
}
// OR just
// implicit val fooRender: Render[Foo] =
// foo => s"ID=${foo.id.toString} / Name=${foo.name}"
}

def bar[A: Render](a: A): Unit =
println(s">> a: ${Render[A].render(a)}")


bar(Foo(1, "Something"))
// >> a: ID=1 / Name=Something

Render.render constructor method​

Render.render[A](A => String): Render[A]

Usage Example​

import extras.render.Render

final case class Foo(id: Int, name: String)
object Foo {
implicit val fooRender: Render[Foo] = Render.render(
foo => s"ID=${foo.id.toString} / Name=${foo.name}"
)
}

def bar[A: Render](a: A): Unit =
println(s">> a: ${Render[A].render(a)}")


bar(Foo(1, "Something"))
// >> a: ID=1 / Name=Something

Render from Existing Render​

If the value of your type can be rendered by an existing Render, you can easily create Render for your type from the existing one with contramap.

Render[A].contramap[B](A => B): Render[B]

Usage Example​

import java.util.UUID
import extras.render.Render

final case class Id(value: UUID) extends AnyVal
object Id {
implicit val idRender: Render[Id] = Render[UUID].contramap(_.value)
}

import extras.render.syntax._
Id(UUID.randomUUID()).render
// res5: String = "d51012ed-cbcb-4d2c-919c-5f1e3fb7a256"

final case class Name(value: String) extends AnyVal
object Name {
implicit val nameRender: Render[Name] = Render[String].contramap(_.value)
}

Name("Kevin").render
// res6: String = "Kevin"