open Printf let gen_stream n = let rec gs i n = if i = n then begin printf "making last element of the stream\n"; flush stdout; [< 'n >] end else begin if i mod 1000 = 0 then begin printf "making next element of the stream: %d\n" i; flush stdout end; [< 'i; (gs (i+1) n) >] end in gs 1 n let rec print_list = function [] -> printf "[]\n" | h::t -> printf "%d::" h; print_list t let rec parse_stream s = match s with parser [< 'i; s' >] -> begin if i mod 1000 = 0 then begin printf "picked element %d\n" i; flush stdout end; i::(parse_stream s') end | [< >] -> (printf "end\n"; flush stdout; []) let rec parse_stream' s = match s with parser [< 'i; tail = parse_stream' >] -> begin if i mod 1000 = 0 then begin printf "picked element %d\n" i; flush stdout end; i::tail end | [< >] -> (printf "end\n"; flush stdout; []) let _ = print_list (parse_stream' (gen_stream 700000))