Как использовать 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 Вот?

0 ответов

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