如果我有一个发送类型值的简单过程,String
并且我希望将它们发送到多个接收器(即每个接收器都被发送String
),我该怎么做?
例如,运行这个程序:
object Play extends App {
def prepend(s: String): String => String = s ++ _
val out1 = io.stdOutLines.map(prepend("1-") andThen _)
val out2 = io.stdOutLines.map(prepend("2-") andThen _)
val p = io.stdInLines to (out1 merge out2)
p.run.run
}
输出如下所示:
a //input
1-a
b //input
2-b
c //input
2-c
d //input
1-d
我希望输出是这样的:
a //input
1-a
2-a
b //input
2-b
1-b
c //input
2-c
1-c
d //input
1-d
2-d
编辑
我可以按如下方式实现:
implicit class ToBoth[O](p: Process[Task, O]) {
def toBoth(s1: Sink[Task, O], s2: Sink[Task, O]): Process[Task, Unit] = {
(for (o <- p; n <- Process.emit(o) ++ Process.emit(o)) yield n) to (s1 interleave s2)
}
}
也就是说,我复制输入并交错输出。这可以概括为:
def toAll(sinks: Sink[Task, O] *): Process[Task, Unit] = {
(for (o <- p; n <- Process.emitAll(sinks.map(_ => o))) yield n) to sinks.reduceLeftOption(_ interleave _).getOrElse(Process.empty)
}
编辑 2
我刚刚意识到泛化toAll
不起作用。toBoth
确实,虽然
有更好的(内置)方法吗?