Desfazer e refazer
Um histórico que acompanha o sinal sem que quem escreve saiba — e o lote que vira um passo só.
Desfazer costuma ser escrito como uma pilha de comandos inversos, e cada comando novo precisa lembrar de empilhar o seu. R.historico inverte isso: ele observa o sinal e anota cada valor anterior. Quem escreve no sinal não sabe que existe desfazer — e por isso não tem como esquecer dele.
dataforge
adopt Arcane.Reativo as R
texto := R.sinal("")
h := R.historico(texto)
texto.escrever("O")
texto.escrever("Ol")
texto.escrever("Olá")
h.desfazer()
assert texto.ler() is "Ol"
h.desfazer()
assert texto.ler() is "O"
h.refazer()
assert texto.ler() is "Ol"
assert h.passos() is {"desfazer": 2, "refazer": 1}
texto.escrever("Oi") // escrever algo novo...
assert not h.pode_refazer() // ...apaga o que dava para refazerUm lote é um passo#
Colar um parágrafo escreve várias vezes; desfazer a colagem deveria voltar tudo. Dentro de R.lote, as escritas viram uma notificação só — e o histórico anota um passo só:
dataforge
adopt Arcane.Reativo as R
doc := R.sinal("")
h := R.historico(doc)
action colar():
doc.escrever("Primeira linha")
doc.escrever("Primeira linha\nSegunda linha")
R.lote(colar)
assert h.passos()["desfazer"] is 1
h.desfazer()
assert doc.ler() is ""- Limite:
R.historico(sinal, 100)guarda até 100 passos e descarta o mais velho — sem teto, editar por horas vira memória. - Só de sinal: um derivado não se escreve, e "desfazer" nele seria desfazer nas fontes — recusado na criação.
- `h.parar()` desliga o histórico quando a tela fecha.