"累积" scalaz-stream channel

时间:2016-01-21 13:47:10

标签: scala scalaz-stream

我尝试实施一个scalaz-stream通道,该通道累积有关其收到的事件的统计信息,一旦完成,就会发出最终的统计信息。

给出一个具体的简化示例:假设您有一个Process[Task, String],其中每个字符串都是一个单词。我希望有一个Channel[Task, String, (String, Int)],当应用于初始过程时,会将其耗尽,计算每个单词出现的次数,并将其发出。

我意识到通过折叠这是微不足道的:

input.foldMap(w => Map(w -> 1))
     .flatMap(m => Process.emitAll(m.toSeq))
     .maximumBy(_._2)

我试图编写的是一系列标准累加器,然后我可以直接管理我的过程 - 而不是明确地折叠,比方说,我写:

input.through(wordFrequency)
     .maximumBy(_._2)

虽然我有点不知所措 - 如果没有共享状态,我无法解决如何做到这一点的问题。写一个积累到Sink的{​​{1}}非常简单,但是一旦接收器终止,就无法获得地图的最终状态并发出它。

0 个答案:

没有答案