Programação reativa
Sinal, derivado e efeito: um valor que outros valores acompanham — com as dependências descobertas na execução.
A linguagem já tinha três formas de lidar com mudança, e nenhuma resolvia o mesmo problema: Arcane.Eventos é um emissor, Arcane.Stream são tópicos com offset (Kafka, e não RxJS), e stream action é um gerador preguiçoso. O que faltava é a quarta — um valor que outros valores acompanham.
É a diferença entre "me avise quando algo acontecer" e "este total é sempre a soma daqueles três".
dataforge
adopt Arcane.Reativo as R
preco := R.sinal(10.0)
quantidade := R.sinal(3)
total := R.derivado(lambda => preco.ler() * quantidade.ler())
out total.ler() // 30.0
quantidade.escrever(5)
out total.ler() // 50.0 — ninguem recalculou a maoSinal é valor; observável é fluxo#
Sinal tem um estado agora, e quem pergunta recebe o valor de agora. Observável não tem estado: quem se inscreve recebe o que vier daqui para a frente. Um clique é um fluxo; um saldo é um valor.
As peças#
| O que é | |
|---|---|
R.sinal(v) | um valor com estado: ler, escrever, atualizar, observar |
R.derivado(f) | calculado de outros — preguiçoso e memorizado |
R.efeito(f) | o que acontece quando muda; roda uma vez ao nascer |
R.lote(f) | várias escritas, uma notificação |
R.observavel() | um fluxo no tempo, com morph, sift, distill… |
R.de_cluster · R.intervalo | fontes frias: só começam quando alguém escuta |
R.juntar · R.combinar | dois fluxos num só |