我想说我想从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
是什么? Aren在interpreter
中完成所有工作的实现?那我不能忘记Stream
吗?
如何在这里实际使用Free
?