Pular para o conteúdo

Observáveis

O fluxo no tempo, os operadores, e por que a fonte fria liga preguiçoso.

Um observável não tem estado: quem se inscreve recebe o que vier daqui para a frente.

dataforge
cliques := R.observavel("cliques")

compras := cliques.sift(lambda v => v["botao"] is "comprar")
produtos := compras.morph(lambda v => v["produto"])
inscricao := produtos.distintos().inscrever(lambda p => vistos.append(p))

cliques.emitir({"botao": "ver", "produto": "cafe"})
cliques.emitir({"botao": "comprar", "produto": "cafe"})

inscricao.cancelar()

Os operadores#

O que faz
morph · sift · distillos mesmos nomes do pipeline >> da linguagem
distintos(chave)só emite quando muda
primeiros(n) · pular(n)recorta o começo do fluxo
blocos(n)junta em grupos de n
esperar(s) · limitar(s)debounce e throttle
ao_falhar(f)o erro como valor, e não como interrupção
para_sinal(inicial)transforma o fluxo em valor

A fonte fria liga preguiçoso#

R.de_cluster e R.intervalo são frias: só começam quando alguém escuta. O operador só se conecta à sua fonte ao receber o primeiro inscrito — e isso não é uma otimização.

dataforge
pares := R.de_cluster([1, 2, 3, 4]).sift(lambda n => n % 2 is 0)
pares.morph(lambda n => n * 10).inscrever(lambda n => vistos.append(n))
assert vistos is [20, 40]

Juntar e combinar#

R.juntar(a, b) intercala os dois fluxos. R.combinar(a, b) emite uma tupla com o último de cada sempre que qualquer um emite — e só depois que todos já emitiram ao menos uma vez, porque antes disso não há "último" para um deles.

O exemplo completo#

examples/reativo_carrinho.df percorre sinal, derivado, efeito, lote e observável num carrinho de compras, com assert em cada afirmação — inclusive as contagens que provam a preguiça.