Kantan.csv has a scalaz module that is, in its current incarnation, fairly bare
bones: it provides decoders for Maybe and \/ as well as a few useful type class instances.
The scalaz module can be used by adding the following dependency to your build.sbt:
libraryDependencies += "io.github.kantan-scala" %% "kantan.csv-scalaz" % "0.11.0"
You then need to import the corresponding package:
import kantan.csv.scalaz.*
\/ codecsFor any two types A and B that each have a CellEncoder, there exists a
CellEncoder[A \/ B]. If A and B each have a RowEncoder, there exists a RowEncoder[A \/ B].
By the same token, for any two types A and B that each have a CellDecoder, there exists a
CellDecoder[A \/ B]. If A and B each have a RowDecoder, there exists a RowDecoder[A \/ B].
First, a few imports:
import _root_.scalaz.*
import kantan.csv.*
import kantan.csv.ops.*
We can then simply write the following:
"1,2\n4,true".readCsv[List, (Int, Int \/ Boolean)](rfc)
// res0: List[ReadResult[(Int, Int \/ Boolean)]] = List(
// Right(value = (1, -\/(a = 2))),
// Right(value = (4, \/-(b = true)))
// )
"1,2\n4,true".readCsv[List, (Int, Int) \/ (Int, Boolean)](rfc)
// res1: List[ReadResult[(Int, Int) \/ (Int, Boolean)]] = List(
// Right(value = -\/(a = (1, 2))),
// Right(value = \/-(b = (4, true)))
// )
Maybe decoderFor any type A that has:
CellDecoder, there exists a CellDecoder[Maybe[A]]RowDecoder, there exists a RowDecoder[Maybe[A]]CellEncoder, there exists a CellEncoder[Maybe[A]]RowEncoder, there exists a RowEncoder[Maybe[A]]You can write, for example:
"1,2\n3,".readCsv[List, (Int, Maybe[Int])](rfc)
// res2: List[ReadResult[(Int, Maybe[Int])]] = List(
// Right(value = (1, Just(get = 2))),
// Right(value = (3, Empty()))
// )
The following instance for cats type classes are provided:
MonadError and Plus for all decoders (CellDecoder and RowDecoder).Contravariant for all encoders (CellEncoder and RowEncoder).Show and Equal for all error types (ReadError and all its descendants).RowEncoder for any type that has a Foldable.