Implementando um operador tipo torniquete com o RxJava

Preciso de ajuda para implementar um operador semelhante ao torniquete no RxJava (RxScala). Passei bastante tempo pensando sobre isso, mas pareço estar presa.

O tipo da função deve ser o seguinte:

def turnstile[T](queue: Observable[T], turnstile: Observable[Boolean]): Observable[T]

A idéia é que o comportamento do operador seja muito semelhante a uma catraca real. Há pessoas vindo (queue) e existe umturnstile que está pronto para aceitar novassolteiro pessoa (umtrue elemento no torniquete, você pode imaginá-lo como um token inserido no torniquete) ou fechado (false no torniquete, cancelando o token anterior). Para cadatrue elemento no torniquete, apenas uma pessoa pode passar.

Além disso, a inserção de vários tokens seguidos (váriostrue itens em um torniquete) sem que uma pessoa passe seja o mesmo que inserir apenas um token; o torniquete não conta os tokens.

Em outras palavras, o torniquete é inicialmente fechado. Quando umtrue aparece nele, abre para uma única pessoa. Se uma pessoa aparecer, ela passa (para a saída) e a catraca fecha novamente. Se umfalse elemento aparece no torniquete, o torniquete também fecha.

queue       ----A---B-------------C--D--
turnstile   --T--------T--T-T-T-T------T
            ============================
output      ----A------B----------C----D

Um diagrama de mármore mostrando a catraca aberta aguardando uma pessoa A, depois a pessoa B aguardando a abertura da catraca e, em seguida, vários tokens se comportando à medida que uma pessoa C passa, mas a pessoa D precisa esperar novamente por um novo token

----A----B--
--T---T-F-T-
============
----A-----B-

Um diagrama de mármore mostrando comofalse elemento no torniquete fecha o torniquete novamente.

Qualquer ajuda é apreciada. Eu acho que a única maneira de implementar isso sem escrever um operador personalizado seria usando ozip operador de alguma forma, porque provavelmente é o único operador que faz com que os elementos de uma sequência esperem pelos elementos da outra (ou existem outros que eu não conheça?). Mas eu precisonão feche alguns dos elementos da catraca, dependendo se eles foram pareados com uma pessoa ou não ...

Penso que este é um problema interessante e estou bastante curioso sobre uma boa solução para ele.

questionAnswers(2)

yourAnswerToTheQuestion