Сокращение монокля для преобразования двух запечатанных черт
У меня есть две изоморфные запечатанные черты, и я хочу легко конвертировать между ними. Я могу сделать это от руки так:
import monocle.Iso
sealed trait StrNum
final case class Str(s: String) extends StrNum
final case class Num(s: Int) extends StrNum
val strnum2either = Iso[StrNum, Either[String, Int]] {
case Str(s) => Left(s)
case Num(n) => Right(n)
} {
case Left(s) => Str(s)
case Right(n) => Num(n)
}
strnum2either.get(Num(5)) // -> Right(5)
strnum2either.get(Str("x")) // -> Left("x")
strnum2either.reverse.get(Left("y")) // -> Str("y")
strnum2either.reverse.get(Right(6)) // -> Num(6)
Есть ли какое-нибудь сокращение для этого механического преобразования? В идеале я хотел бы какой-то макрос вроде:
val strnum2either = GenIso[StrNum, Either[String, Int]]
Похоже, что такого рода вещи должны быть возможны, учитывая запечатанные признаки, у которых классы прецедентов имеют уникальные члены, совпадающие с эквивалентными классами прецедентов изоморфных признаков.