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 · distill | os 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.