Сокращение монокля для преобразования двух запечатанных черт

У меня есть две изоморфные запечатанные черты, и я хочу легко конвертировать между ними. Я могу сделать это от руки так:

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]]

Похоже, что такого рода вещи должны быть возможны, учитывая запечатанные признаки, у которых классы прецедентов имеют уникальные члены, совпадающие с эквивалентными классами прецедентов изоморфных признаков.

0 ответов

Другие вопросы по тегам