diff --git a/csv/shared/src/main/scala/fs2/data/csv/CellEncoder.scala b/csv/shared/src/main/scala/fs2/data/csv/CellEncoder.scala index 79b49b091..cf77a5577 100644 --- a/csv/shared/src/main/scala/fs2/data/csv/CellEncoder.scala +++ b/csv/shared/src/main/scala/fs2/data/csv/CellEncoder.scala @@ -58,6 +58,9 @@ object CellEncoder @inline def fromToString[A]: CellEncoder[A] = _.toString + @inline + def fromShow[A](implicit ev: Show[A]): CellEncoder[A] = instance(ev.show) + // Primitives implicit val unitEncoder: CellEncoder[Unit] = _ => "" implicit val booleanEncoder: CellEncoder[Boolean] = fromToString(_) diff --git a/csv/shared/src/test/scala/fs2/data/csv/CellEncoderTest.scala b/csv/shared/src/test/scala/fs2/data/csv/CellEncoderTest.scala index 982570790..a3aa055cc 100644 --- a/csv/shared/src/test/scala/fs2/data/csv/CellEncoderTest.scala +++ b/csv/shared/src/test/scala/fs2/data/csv/CellEncoderTest.scala @@ -22,6 +22,8 @@ import weaver._ import scala.concurrent.duration._ +import cats.Show + object CellEncoderTest extends SimpleIOSuite { // CellEncoder should have implicit instances available for standard types @@ -53,7 +55,7 @@ object CellEncoderTest extends SimpleIOSuite { CellEncoder[java.time.ZoneId] CellEncoder[java.time.ZoneOffset] - pureTest("CellEncoder should decode standard types correctly") { + pureTest("CellEncoder should encode standard types correctly") { expect(CellEncoder[Unit].apply(()) == "") and expect(CellEncoder[Int].apply(78) == "78") and expect(CellEncoder[Boolean].apply(true) == "true") and @@ -73,4 +75,13 @@ object CellEncoderTest extends SimpleIOSuite { .apply(java.time.LocalTime.of(13, 4, 29)) == "13:04:29") } + pureTest("CellEncoder instance can be built from native cats.Show instance") { + expect(CellEncoder.fromShow[Double].apply(3.54) == "3.54") + } + + pureTest("CellEncoder instance can be built from local cats.Show instance") { + implicit val showInt42: Show[Int] = Show.show(_ => "42") + expect(CellEncoder.fromShow[Int].apply(78) == "42") + } + }