src/Pure/General/history.ML
author wenzelm
Mon, 16 Nov 1998 11:32:28 +0100
changeset 5893 c755dfd02509
parent 5039 28c18f9e106e
child 6680 7f97bb4f790d
permissions -rw-r--r--
added oo, ooo (*concatenation: 2 and 3 args*);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5039
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/General/history.ML
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
     4
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
     5
Histories of values, with undo and redo.
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
     6
*)
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
     7
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
     8
signature HISTORY =
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
     9
sig
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    10
  type 'a T
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    11
  val init: 'a -> 'a T
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    12
  val current: 'a T -> 'a
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    13
  val clear: 'a T -> 'a T
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    14
  val undo: 'a T -> 'a T
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    15
  val redo: 'a T -> 'a T
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    16
  val apply: ('a -> 'a) -> 'a T -> 'a T
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    17
end;
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    18
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    19
structure History: HISTORY =
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    20
struct
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    21
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    22
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    23
(* datatype history *)
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    24
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    25
datatype 'a T =
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    26
  History of 'a * 'a list * 'a list;
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    27
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    28
fun init x = History (x, [], []);
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    29
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    30
fun current (History (x, _, _)) = x;
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    31
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    32
fun clear (History (x, _, _)) = History (x, [], []);
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    33
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    34
fun undo (History (_, [], _)) = error "No further undo information"
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    35
  | undo (History (x, u :: undo_list, redo_list)) = History (u, undo_list, x :: redo_list);
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    36
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    37
fun redo (History (_, _, [])) = error "No further redo information"
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    38
  | redo (History (x, undo_list, r :: redo_list)) = History (r, x :: undo_list, redo_list);
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    39
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    40
fun apply f (History (x, undo_list, _)) =
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    41
  History (f x, x :: undo_list, []);
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    42
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    43
28c18f9e106e Histories of values, with undo and redo;
wenzelm
parents:
diff changeset
    44
end;