2016-04-15 8 views
0

Вопрос довольно прост, но я не могу найти хорошее решение.FRP: как умножить количество событий в одном потоке

Предположим, у меня есть поток. Поток может отправить только 4 события: А, В, С, 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 лично, но вы можете отвечать на любой другой язык, это просто не имеет значения.

ответ

1

Я нашел решение, которое работает для меня. Мое предположение о сглаживании потоков было довольно разумным. Так вот как я достиг желаемого результата:

// 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 для преобразования первого производителя сигнала в секунду, который кодирует каждый из A, B, C и D на 4 сигналов Bool.

Это основы Frp, но я надеюсь, что некоторые из новичков могут найти это полезным.