-- HistoryEventImpl.mesa -- written by Bill Paxton, June 1981 -- last edit by Bill Paxton, 24-Jun-81 16:47:49 DIRECTORY HistoryEvent, SafeStorage; HistoryEventImpl: PROGRAM IMPORTS SafeStorage EXPORTS HistoryEvent = BEGIN OPEN HistoryEvent; Ref: TYPE = REF EventBody; EventBody: PUBLIC TYPE = RECORD [ undone: BOOLEAN _ FALSE, subevents: SubEvent, ]; SubEvent: TYPE = REF SubEventBody; SubEventBody: TYPE = RECORD [ next: SubEvent, undoProc: PROC, undoRef: REF ]; zone: ZONE _ SafeStorage.NewZone[quantized]; Create: PUBLIC PROC RETURNS [Ref] = { RETURN [NEW[EventBody]] }; Note: PUBLIC PROC [event: Ref, undoProc: PROC, undoRef: REF] = { IF event = NIL THEN RETURN; event.subevents _ zone.NEW[SubEventBody _ [ event.subevents, undoProc, undoRef]] }; Undo: PUBLIC PROC [event: Ref] RETURNS [ok: BOOLEAN]; -- returns false if event was previously undone -- otherwise, calls undoProc[undoRef] for each subevent -- in reverse order that subevents originally happened IF event=NIL OR event.undone THEN RETURN [FALSE]; event.undone _ TRUE; FOR sub:SubEvent _ event.subevents, sub.next UNTIL sub=NIL DO sub.undoProc[sub.undoRef]; ENDLOOP; RETURN [TRUE] }; Start: PUBLIC PROC = { }; END.