Как использовать Free с парами в fs2?
Допустим, я хочу прочитать данные из jms, отобразить их через toUpperCase
и отправить в другое место. Поэтому я абстрагируюсь от реальной системы обмена сообщениями с Jms[A]
, право?
trait Jms[A]
case object Pull extends Jms[String]
case class Push(s: String) extends Jms[Unit]
Бизнес логика:
def freeProcess(source: Stream[Jms, String], sink: Sink[Jms, String]): Free[Jms, Unit] =
source.map(_.toUpperCase).through(sink).runFree
Free
должно быть истолковано, так и будет:
val interpreter = new ~>[Jms, Task] {
def apply[A](f: Jms[A]): Task[A] = f match {
case Pull => Task.now {
/* await on socket; toString */
"incoming"
}
case Push(m: String) => Task.now {
/* push to socket */
()
}
}
}
Но что перейти на freeProcess
? Что это source
/ sink
? Не являются реализации в interpreter
делать всю работу? Разве я не могу просто забыть о Stream
тогда?
Как на самом деле использовать Free
Вот?