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
すべての仕事をする上での実装ではありませんか? sのことを忘れることはできませんStream
か?
ここで実際に使用する方法はFree
?