Skip to main content

Render from Another

Module

  • The core module:
    "io.kevinlee" %% "extras-render" % "0.46.1"

or for Scala.js:

  • The core module:
    "io.kevinlee" %%% "extras-render" % "0.46.1"

contramap

If you have a Render[A] and know how to B => A, you can get Render[B] out of the box with contramap!

import extras.render.Render
import extras.render.syntax._

final case class Id(value: Int) extends AnyVal

/*
* Get `Render[Id]` from `Render[Id]` with `Id => Int` (i.e. `Id.value`)
*/
implicit val renderId: Render[Id] =
Render[Int].contramap(_.value) // Render[Int] is already provided by extras.
// renderId: Render[Id] = extras.render.Render$RenderOps$$$Lambda$8944/0x0000000102533840@27dcdfb7

Id(123).render
// res1: String = "123"

Contravariant

If your project uses cats, you get Contravariant[Render] out of the box! With Contravariant[Render], you can get Render[B] from Render[A] if you know how to B => A.

import cats._

import extras.render.Render
import extras.render.syntax._

final case class Id(value: Int) extends AnyVal

/*
* With `Contravariant[Render]`,
* get `Render[Id]` from `Render[Id]` with `Id => Int` (i.e. `Id.value`)
*/
implicit val renderId: Render[Id] =
Contravariant[Render].contramap(Render[Int])(_.value) // Render[Int] is already provided by extras.
// renderId: Render[Id] = extras.render.Render$$anon$1$$Lambda$8945/0x0000000102533c40@208ca866

Id(123).render
// res3: String = "123"