Pular para o conteúdo

Operadores de fluxo

morph, sift, distill, distintos, primeiros, pular, blocos, esperar e limitar — e quando cada um cabe.

Um observável é um fluxo de valores no tempo, e os operadores montam fluxos a partir de outros — cada um devolve um observável novo, e o original continua como estava.

dataforge
adopt Arcane.Reativo as R

cliques := R.observavel("cliques")
vistos := []
pares_vezes_dez := cliques.sift(lambda v: v % 2 is 0).morph(lambda v: v * 10)
inscricao := pares_vezes_dez.inscrever(lambda v: vistos.append(v))

cycle i in range(1, 7):
    cliques.emitir(i)
assert vistos is [20, 40, 60]

inscricao.cancelar()
cliques.emitir(8)
assert vistos is [20, 40, 60]           // cancelado, não recebe mais
OperadorEmitePara
morph(f)f(v) de cada valortransformar
sift(cond)só o que passafiltrar
distill(f, inicial)o acumulado até aquisomatório corrente, estado de um jogo
distintos()só quando muda em relação ao anteriornão redesenhar à toa
primeiros(n) · pular(n)os n primeiros · depois dos n primeiroso primeiro clique, ignorar o aquecimento
blocos(n)grupos de ngravar em lote
esperar(s)só quando para de chegar por s segundosa caixa de busca (debounce)
limitar(s)no máximo um por janelao botão que não pode ser clicado duas vezes (throttle)
para_sinal(inicial)vira um sinal com o último valorligar o fluxo a um derivado
dataforge
adopt Arcane.Reativo as R

vendas := R.observavel()
total := vendas.distill(lambda acc, v: acc + v, 0).para_sinal(0)
vendas.emitir(30)
vendas.emitir(12)
assert total.ler() is 42

leituras := R.observavel()
mudou := []
leituras.distintos().inscrever(lambda v: mudou.append(v))
cycle v in [20, 20, 21, 21, 20]:
    leituras.emitir(v)
assert mudou is [20, 21, 20]

lotes := []
fonte := R.observavel()
fonte.blocos(2).inscrever(lambda b: lotes.append(b))
cycle v in [1, 2, 3, 4]:
    fonte.emitir(v)
assert lotes is [[1, 2], [3, 4]]