我尝试实施一个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}}非常简单,但是一旦接收器终止,就无法获得地图的最终状态并发出它。