FRP:如何乘以一个流中的事件数

FRP: How to multiply the number of events in one stream

问题很简单,但我想不出好的解决方案。

假设我有一个流。该流只能发送 4 个事件:A、B、C、D

可以表示为:

[--A--A----C---B--D--...]

现在考虑一下,每个事件都有其编码值。 例如:

A -> 1, 0, 0, 0
B -> 0, 1, 0, 0
...

现在的问题是:如何使用 A、B、C、D 事件的编码值转换此流,使每个事件都表示为 4 个事件。

为了让一切都清楚,这就是我想要的:

我的流:

[--A--A----C---B--D--...]

我知道:

A -> 1, 0, 0, 0
B -> 0, 1, 0, 0
...

我要制作的直播:

[--1-0-0-0--1-0-0-0----0-0-1-0---0-1-0-0--0-0-0-1--...]

我能想出的一个解决方案是映射流,为每个事件返回子流,然后将结果展平。但是我不确定它应该如何根据 FRP 来实现。

如果我应该使用流组合,请提供相关示例。 我个人使用Reactive-Cocoa,但你可以用任何其他语言回答,没关系。

我找到了适合我的解决方案。我对扁平流的猜测是非常合理的。所以这就是我如何实现预期结果的:

// first producer is SignalProducer<String, NoError>
// which posts events "A", "B", "C", "D"

    let secondProducer = firstProducer.flatMap(.Latest, transform: { value -> SignalProducer<Bool, NoError> in

        let result:[Bool] = ["A" == value, "B" == value,  "C" == value, "D" == value]
        return SignalProducer<Bool, NoError>(values: result)
    })

    secondProducer.startWithNext({value in
        print("value : \(value)")
    })

这里的要点是:我用flatMap把第一个signal producer转换成第二个,把A,B,C,D分别编码成4个Bool的signal。

是Frp的基础知识,希望对初学者有所帮助