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"
info