Pular para o conteúdo

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 refazer

Um 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.