82 lines
1.7 KiB
OCaml
82 lines
1.7 KiB
OCaml
(* camlp4r *)
|
|
(* This file has been generated by program: do not edit! *)
|
|
(* Copyright 2001 INRIA *)
|
|
|
|
type 'a t = { count : int; data : 'a data Lazy.t }
|
|
and 'a data = Nil | Cons of 'a * 'a t | App of 'a t * 'a t
|
|
;;
|
|
|
|
let from f =
|
|
let rec loop i =
|
|
{count = 0;
|
|
data =
|
|
lazy
|
|
(match f i with
|
|
Some x -> Cons (x, loop (i + 1))
|
|
| None -> Nil)}
|
|
in
|
|
loop 0
|
|
;;
|
|
|
|
let rec next s =
|
|
let count = s.count + 1 in
|
|
match Lazy.force s.data with
|
|
Nil -> None
|
|
| Cons (a, s) -> Some (a, {count = count; data = s.data})
|
|
| App (s1, s2) ->
|
|
match next s1 with
|
|
Some (a, s1) -> Some (a, {count = count; data = lazy (App (s1, s2))})
|
|
| None ->
|
|
match next s2 with
|
|
Some (a, s2) -> Some (a, {count = count; data = s2.data})
|
|
| None -> None
|
|
;;
|
|
|
|
let empty s =
|
|
match next s with
|
|
Some _ -> None
|
|
| None -> Some ((), s)
|
|
;;
|
|
|
|
let nil () = {count = 0; data = Lazy.lazy_from_val Nil};;
|
|
let cons a s = Cons (a, s);;
|
|
let app s1 s2 = App (s1, s2);;
|
|
let flazy f = {count = 0; data = Lazy.lazy_from_fun f};;
|
|
|
|
let of_list l =
|
|
List.fold_right (fun x s -> flazy (fun () -> cons x s)) l (nil ())
|
|
;;
|
|
|
|
let of_string s =
|
|
from (fun c -> if c < String.length s then Some s.[c] else None)
|
|
;;
|
|
|
|
let of_channel ic =
|
|
from
|
|
(fun _ ->
|
|
try Some (input_char ic) with
|
|
End_of_file -> None)
|
|
;;
|
|
|
|
let iter f =
|
|
let rec do_rec strm =
|
|
match next strm with
|
|
Some (a, strm) -> let _ = f a in do_rec strm
|
|
| None -> ()
|
|
in
|
|
do_rec
|
|
;;
|
|
|
|
let count s = s.count;;
|
|
|
|
let count_unfrozen s =
|
|
let rec loop cnt s =
|
|
if Lazy.lazy_is_val s.data then
|
|
match Lazy.force s.data with
|
|
Cons (_, s) -> loop (cnt + 1) s
|
|
| _ -> cnt
|
|
else cnt
|
|
in
|
|
loop 0 s
|
|
;;
|