如何使用Scalaz-Stream创建流?

时间:2014-11-19 18:18:57

标签: scala functional-programming scalaz-stream

一定很简单。但由于某种原因,我无法使其发挥作用。

  • 如果我io.linesR(...),我有一行文件的行,没关系。
  • 如果我Processor.emitAll(),我有一组预定义的值。它也有效。

但我真正需要的是异步生成scalaz-stream的值(好吧,来自Akka actor)。

我试过了:

  • async.unboundedQueue[String]
  • async.signal[String]

然后调用queue.enqueueOne(...).runsignal.set(...).run并听取queue.dequeuesignal.discrete。只需使用.map.to。一个例子证明可以使用另一种流 - 使用处理器或文件中的行。

秘密是什么?创建要在以后流式传输的频道的首选方法是什么?如何用来自另一个上下文的值来提供它?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果值是以异步方式生成的,但是可以从流中驱动,我发现使用"原语"最容易。 await方法并手工构建流程"。你需要一个间接递归函数:

def processStep(v: Int): Process[Future, Int] =
  Process.emit(v) ++ Process.await(myActor ? NextValuePlease())(w => processStep(w))

但是如果你需要一个真正的异步过程,从其他地方开始,我从未这样做过。