My working unpac repository
1(**************************************************************************)
2(* *)
3(* OCaml *)
4(* *)
5(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
6(* *)
7(* Copyright 1996 Institut National de Recherche en Informatique et *)
8(* en Automatique. *)
9(* *)
10(* All rights reserved. This file is distributed under the terms of *)
11(* the GNU Lesser General Public License version 2.1, with the *)
12(* special exception on linking described in the file LICENSE. *)
13(* *)
14(**************************************************************************)
15
16type 'a t = { mutable c : 'a list; mutable len : int; }
17
18exception Empty
19
20let create () = { c = []; len = 0; }
21
22let clear s = s.c <- []; s.len <- 0
23
24let copy s = { c = s.c; len = s.len; }
25
26let push x s = s.c <- x :: s.c; s.len <- s.len + 1
27
28let pop s =
29 match s.c with
30 | hd::tl -> s.c <- tl; s.len <- s.len - 1; hd
31 | [] -> raise Empty
32
33let pop_opt s =
34 match s.c with
35 | hd::tl -> s.c <- tl; s.len <- s.len - 1; Some hd
36 | [] -> None
37
38let drop s =
39 match s.c with
40 | _hd::tl -> s.c <- tl; s.len <- s.len - 1
41 | [] -> raise Empty
42
43let top s =
44 match s.c with
45 | hd::_ -> hd
46 | [] -> raise Empty
47
48let top_opt s =
49 match s.c with
50 | hd::_ -> Some hd
51 | [] -> None
52
53let is_empty s = (s.c = [])
54
55let length s = s.len
56
57let iter f s = List.iter f s.c
58
59let fold f acc s = List.fold_left f acc s.c
60
61(** {1 Iterators} *)
62
63let to_seq s = List.to_seq s.c
64
65let add_seq q i = Seq.iter (fun x -> push x q) i
66
67let of_seq g =
68 let s = create() in
69 add_seq s g;
70 s