假设我想从 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
? 这些/是什么?实现不是在完成所有工作吗?那我就不能忘记s吗?source
sink
interpreter
Stream
怎么在这里实际使用Free
?