У меня есть относительно эргономичный рисунок, который я использую для сопоставления с бесформенным Coproduct
с.В основном это выглядит так:
val stringOrInt: String :+: Int :+: CNil = Coproduct("Hello world")
implicit class Coproduct2Syntax[A, B](val value: A :+: B :+: CNil) extends AnyVal {
type cop = A :+: B :+: CNil
def comatch[Z](
caseA: PartialFunction[A, Z],
caseB: PartialFunction[B, Z]
): Z = {
val a = Function.unlift[cop, Z](_.select[A].flatMap(caseA.lift))
val b = Function.unlift[cop, Z](_.select[B].flatMap(caseB.lift))
a.orElse(b).apply(value)
}
}
stringOrInt.comatch({
case s => s.length
},{
case i => i
})
// Int = 11
Это работает достаточно хорошо, но я не сталкивался с проблемой определения CoproductNSyntax
для 0-22.
Я знаю, что мы можем сделать нечто подобное с Poly1
, но для этого необходимо определить отдельный объект
Мой вопрос: существуют ли какие-либо библиотеки, которые предоставляют этот тип шаблона для сопоставления?за Coproduct
с?