Skip to main content

Render from Another

Module​

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

or for Scala.js:

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

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$12758/0x00000008034b7c40@4cecc6fd

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$12772/0x00000008034c3c40@3c9f5677

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