src/Pure/General/stack.ML
author wenzelm
Thu, 09 Feb 2017 15:40:34 +0100
changeset 65009 eda9366bbfac
parent 58797 6d71f19a9fd6
permissions -rw-r--r--
remote database access via ssh port forwarding;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17368
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/General/stack.ML
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
     3
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
     4
Non-empty stacks.
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
     5
*)
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
     6
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
     7
signature STACK =
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
     8
sig
58797
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
     9
  type 'a T
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    10
  val make: 'a -> 'a list -> 'a T
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    11
  val dest: 'a T -> 'a * 'a list
17368
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    12
  val level: 'a T -> int
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    13
  val init: 'a -> 'a T
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    14
  val top: 'a T -> 'a
21272
a87b27cdd142 separate map_top/all;
wenzelm
parents: 17756
diff changeset
    15
  val map_top: ('a -> 'a) -> 'a T -> 'a T
a87b27cdd142 separate map_top/all;
wenzelm
parents: 17756
diff changeset
    16
  val map_all: ('a -> 'a) -> 'a T -> 'a T
17368
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    17
  val push: 'a T -> 'a T
47060
e2741ec9ae36 prefer explicitly qualified exception List.Empty;
wenzelm
parents: 29606
diff changeset
    18
  val pop: 'a T -> 'a T      (*exception List.Empty*)
17368
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    19
end;
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    20
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    21
structure Stack: STACK =
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    22
struct
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    23
58797
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    24
abstype 'a T = Stack of 'a * 'a list
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    25
with
17368
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    26
58797
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    27
fun make x xs = Stack (x, xs);
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    28
fun dest (Stack (x, xs)) = (x, xs);
17368
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    29
58797
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    30
fun level (Stack (_, xs)) = length xs;
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    31
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    32
fun init x = Stack (x, []);
17368
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    33
58797
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    34
fun top (Stack (x, _)) = x;
21272
a87b27cdd142 separate map_top/all;
wenzelm
parents: 17756
diff changeset
    35
58797
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    36
fun map_top f (Stack (x, xs)) = Stack (f x, xs);
17368
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    37
58797
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    38
fun map_all f (Stack (x, xs)) = Stack (f x, map f xs);
17368
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    39
58797
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    40
fun push (Stack (x, xs)) = Stack (x, x :: xs);
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    41
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    42
fun pop (Stack (_, x :: xs)) = Stack (x, xs)
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    43
  | pop (Stack (_, [])) = raise List.Empty;
17368
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    44
e02adca07c31 Non-empty stacks.
wenzelm
parents:
diff changeset
    45
end;
58797
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    46
6d71f19a9fd6 more abstract type;
wenzelm
parents: 49063
diff changeset
    47
end;