Реализация турникетоподобного оператора с 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 оператор как-то, потому что это, вероятно, единственный оператор, который заставляет элементы из одной последовательности ждать элементы из другой (или есть другие, о которых я не знаю?). Но мне нужноне застегните некоторые элементы турникета в зависимости от того, были ли они в паре с человеком или нет ...

Я думаю, что это интересная проблема, и мне довольно любопытно найти какое-то хорошее решение.