9 | n -> f () ;times f (n-1)
11 let rec repeat n f stream =
15 match stream with parser
17 c::repeat (n-1) f stream
19 raise (Stream.Error "invalid format")
21 let repeat_l n f stream =
22 repeat (Int32.to_int n) f stream
24 let string str stream =
26 ExtString.String.explode str in
29 match Stream.npeek n stream with
31 times (fun ()->Stream.junk stream) n;
37 match Stream.peek stream with
44 let rec until c stream =
45 match Stream.peek stream with
52 let one_of str stream =
53 match Stream.peek stream with
54 Some c when String.contains str c ->
62 with Stream.Failure ->
70 let rec many parse stream =
71 match stream with parser
72 [< e = parse; s>] -> e::many parse s
75 let many1 parse stream =
81 match Stream.peek stream with
82 Some ('a'..'z') | Some ('A'..'Z') ->
88 match Stream.peek stream with
96 Use black-magic to save stream state
99 type 'a t = { count : int; data : 'a data }
109 with Stream.Failure | Stream.Error _ ->
110 Obj.set_field t 0 count;
111 Obj.set_field t 1 data;
116 let string str stream =
120 ExtString.String.implode @@
122 Stream.npeek n stream in
124 (times (fun ()->Stream.junk stream) n;