| 28127 |      1 | (*  Title:      Pure/General/queue.ML
 | 
|  |      2 |     Author:     Makarius
 | 
|  |      3 | 
 | 
|  |      4 | Efficient queues.
 | 
|  |      5 | *)
 | 
|  |      6 | 
 | 
|  |      7 | signature QUEUE =
 | 
|  |      8 | sig
 | 
|  |      9 |   type 'a T
 | 
|  |     10 |   val empty: 'a T
 | 
|  |     11 |   val is_empty: 'a T -> bool
 | 
|  |     12 |   val content: 'a T -> 'a list
 | 
|  |     13 |   val enqueue: 'a -> 'a T -> 'a T
 | 
|  |     14 |   val dequeue: 'a T -> 'a * 'a T
 | 
|  |     15 | end;
 | 
|  |     16 | 
 | 
|  |     17 | structure Queue: QUEUE =
 | 
|  |     18 | struct
 | 
|  |     19 | 
 | 
|  |     20 | datatype 'a T = Queue of 'a list * 'a list;
 | 
|  |     21 | 
 | 
|  |     22 | val empty = Queue ([], []);
 | 
|  |     23 | 
 | 
|  |     24 | fun is_empty (Queue ([], [])) = true
 | 
|  |     25 |   | is_empty _ = false;
 | 
|  |     26 | 
 | 
|  |     27 | fun content (Queue (xs, ys)) = ys @ rev xs;
 | 
|  |     28 | 
 | 
|  |     29 | fun enqueue x (Queue (xs, ys)) = Queue (x :: xs, ys);
 | 
|  |     30 | 
 | 
|  |     31 | fun dequeue (Queue (xs, y :: ys)) = (y, Queue (xs, ys))
 | 
|  |     32 |   | dequeue (Queue (xs as _ :: _, [])) = let val y :: ys = rev xs in (y, Queue ([], ys)) end
 | 
|  |     33 |   | dequeue (Queue ([], [])) = raise Empty;
 | 
|  |     34 | 
 | 
|  |     35 | end;
 |