RxJs: Como fazer um loop com base no estado do observável?

Estou tentando fazer com que os RxJs façam um loop sobre um Observable no meu fluxo até que ele esteja em um determinado estado e depois o fluxo continue. Especificamente, estou convertendo um loop síncrono do / while em RxJs, mas presumo que a mesma resposta também possa ser usada para um loop for ou while.

Eu pensei que poderia usar doWhile () para isso, mas parece que a função de condição não tem acesso ao item no fluxo, o que parece anular o objetivo para mim.

Não sei ao certo qual é a terminologia reativa correta para o que eu quero, mas aqui está um exemplo do que estou buscando:

var source = new Rx.Observable.of({val: 0, counter: 3});

source.map(o => {
  o.counter--;
  console.log('Counter: ' + o.counter);

  if (!o.counter) {
    o.val = "YESS!";
  }
  return o;
})
.doWhile(o => { 
  return o.counter > 0; 
})
.subscribe(
    function (x) {
        console.log('Next: ' + x.val);
    },
    function (err) {
        console.log('Error: ' + err);   
    },
    function () {
        console.log('Completed');   
    });

A saída esperada seria:

Counter: 3
Counter: 2
Counter: 1
Counter: 0
Next: YESS!
Completed

Supondo que este seja um problema solucionável, não estou claro como você marca o 'início' de onde deseja retornar quando faz um loop.

questionAnswers(2)

yourAnswerToTheQuestion