implicit def hlistEncoder[H, T <: HList](
hEncoder: Lazy[CsvEncoder[H]], // wrap in Lazy
): CsvEncoder[H :: T] = createEncoder {
hEncoder.value.encode(h) ++ tEncoder.encode(t)
implicit def coproductEncoder[H, T <: Coproduct](
hEncoder: Lazy[CsvEncoder[H]], // wrap in Lazy
): CsvEncoder[H :+: T] = createEncoder {
case Inl(h) => hEncoder.value.encode(h)
case Inr(t) => tEncoder.encode(t)
implicit def genericEncoder[A, R](
rEncoder: Lazy[CsvEncoder[R]] // wrap in Lazy
): CsvEncoder[A] = createEncoder { value =>
rEncoder.value.encode(gen.to(value))