Хм .. звучит как observable.DistinctUntilChanged
для обнаружения различных событий, но объединяется через CombineLatest
с observable.Debounce
, чтобы также получить повторение через некоторое время ....
Это охватило бы основы, но я не уверен, что произойдет, если элемент, отличный от предыдущего, появится после "время дольше, чем отладка". Оба источника, операторы DistinctUntilChanged и Debounce, пропустят элемент "на в то же время ", и я не уверен, что будет делать CombineLatest на этом этапе. Есть изменение: вы получите такое событие дважды (одно и то же за очень короткий промежуток времени), поэтому вам потребуется еще раз его дедуплицировать.
Если вы хотите добавить какие-то временные метки, то есть и довольно явный способ сделать это, хотя я не уверен, действительно ли это проще ..
- принимать исходные события - поток {command}
- GroupBy тип элемента - поток подпотока {command}, каждый подпоток содержит ТОЛЬКО один тип команды
- применить TimeInterval к каждому из этих подпотоков, вы получите поток подпотока {команда, время с момента последнего посещения}, каждый подпоток содержит ТОЛЬКО один тип команды
- ОбъединениеПоследнее их всех, вы получаете поток {команда, время, с тех пор как ЭТОТ ТИП был последним увиденным}
- преобразуйте его в {command, null-or-ObjectThatIsAlwaysDifferent} в зависимости от «времени», если время меньше периода удержания, то NULL, если время больше удержания, используйте некоторое магическое значение, которое IsAlwaysDifferent
- DistinctUntilCanged, что
Вы должны иметь возможность реализовать магический ObjectThatIsAlwaysDifferent, просто сделав класс gethashcode равным 0 и равным false.
Это должно возвращать события, которые имеют команду, отличную от предыдущей, или те же, что и раньше, но произошли спустя время, превышающее удержание.
Теперь подумав об этом, можно сделать это очень просто, запечатав текущее и предыдущее значение:
- взять исходный поток {command}
- добавить отметки времени - {команда, отметка времени}
- задержка на 1, помните источник и задержку
- сжать их вместе, теперь вы получаете поток [{command, timestamp}, {prevcommand, prevtimestamp}]
- отфильтруйте его по коду:
- пройти когда команда! = Prevcommand
- пройти, когда команда == prevcommand && timestamp-prevtimestamp> holdoff
и это должно быть. Как обычно, несколько способов сделать одно и то же.