Библиотека для сопоставления с образцом бесформенного копроизведения с частичными функциями - PullRequest
2 голосов
/ 08 июня 2019

У меня есть относительно эргономичный рисунок, который я использую для сопоставления с бесформенным 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 с?

...