Реализация турникетоподобного оператора с RxJava
Мне нужна помощь в реализации турникетного оператора в RxJava (RxScala). Я провел довольно много времени, думая об этом, но я, кажется, застрял.
Тип функции должен быть следующим:
def turnstile[T](queue: Observable[T], turnstile: Observable[Boolean]): Observable[T]
Идея заключается в том, что поведение оператора должно быть очень похоже на настоящий турникет. Есть люди, идущие (queue
) и естьturnstile
который либо готов принять новыйне замужем человек (аtrue
Элемент в турникете можно представить как токен, вставленный в турникет) или закрытый (false
в турникете, отменив предыдущий токен). Для каждогоtrue
Элемент в турникете может пройти только один человек.
Кроме того, вставив несколько жетонов подряд (несколькоtrue
предметы в турникете) без прохода человека - это то же самое, что вставить только один жетон, турникет не считает жетоны.
Другими словами, турникет изначально закрыт. Когдаtrue
элемент появляется в нем, он открывается для одного человека. Если человек появляется, он проходит (к выходу) и турникет снова закрывается. Еслиfalse
элемент появляется в турникете, турникет тоже закрывается.
queue ----A---B-------------C--D--
turnstile --T--------T--T-T-T-T------T
============================
output ----A------B----------C----D
Мраморная диаграмма, показывающая открытый турникет, ожидающий человека A, затем человек B, ожидающий открытия турникета, затем несколько жетонов, ведущих себя как проход одного человека C, но человек D должен снова ждать новый жетон
----A----B--
--T---T-F-T-
============
----A-----B-
Мраморная диаграмма, показывающая, какfalse
Элемент в турникете снова закрывает турникет.
Любая помощь приветствуется. Я думаю, что единственный способ реализовать это без написания пользовательского оператора будет использоватьzip
оператор как-то, потому что это, вероятно, единственный оператор, который заставляет элементы из одной последовательности ждать элементы из другой (или есть другие, о которых я не знаю?). Но мне нужноне застегните некоторые элементы турникета в зависимости от того, были ли они в паре с человеком или нет ...
Я думаю, что это интересная проблема, и мне довольно любопытно найти какое-то хорошее решение.