Render from Another
Module
- The
coremodule:"io.kevinlee" %% "extras-render" % "0.50.1"
or for Scala.js:
- The
coremodule:"io.kevinlee" %%% "extras-render" % "0.50.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$9929/0x0000000802986840@6bbf73e7
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$9943/0x0000000802997040@6386f36c
Id(123).render
// res3: String = "123"
info