My working unpac repository
at opam/upstream/seq 70 lines 2.1 kB view raw
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