Al igual que con muchos patrones de diseño, puede implementar este como una función en clojure. Depende un poco de cómo representas el estado en tu programa (refs, átomos, agentes) a través del proceso es muy similar.
Usted simplemente agrega una función de observador a su estado agent/ref/atom que agrega el estado a la lista de deshacer cada vez que hay una actualización. entonces su función deshacer es solo buscarla en la lista de deshacer. Esto tiene el bonito efecto de agregar tu a la lista de deshacer, permitiendo rehacer también
Mi primera impresión es que ref
s puede ser la herramienta correcta para esto porque podrás restaurarlos todos de forma coordinada , a menos que, por supuesto, pueda reducir el estado de sus programas a una única identidad (en el sentido Clojure de la palabra), entonces no necesitaría una actualización coordinada y un agente funcionaría.
Una pregunta anterior debería ser si realmente necesita o no esta mutación de estado en primer lugar. –
@Alex Taggart: y por supuesto que realmente no (pero considero que ese fue su punto;) He escrito deshacer/rehacer utilizando solo objetos inmutables (en Java). Puede escribir un deshacer/rehacer guardando solo (entradas de usuario) y recreando su "estado" repitiendo sus entradas hasta el tiempo deseado. Entonces, cuando desee deshacer desde "t5 a t4", no "rebobinará" de t5 a t4, pero reproducirá las entradas de t0 a t4 (y porque lo está haciendo de una "manera funcional", está garantizado para terminar con el estado correcto). Funciona en muchos casos y simplifica enormemente la implementación de deshacer/rehacer en mi humilde opinión ... – TacticalCoder