@@ -7,10 +7,6 @@ type 'a iter = ('a -> unit) -> unit
77type 'a equal = 'a -> 'a -> bool
88type 'a printer = Format .formatter -> 'a -> unit
99
10- (* $inject
11- let pp_ilist = CCFormat.(to_string (list int))
12- *)
13-
1410(* * {2 Basics} *)
1511
1612[@@@ warning " -37" ]
@@ -34,11 +30,6 @@ type +'a t =
3430
3531let empty : type a. a t = Shallow Zero
3632
37- (* $R
38- let q = empty in
39- OUnit2.assert_bool "is_empty" (is_empty q)
40- *)
41-
4233exception Empty
4334
4435let _empty = Shallow Zero
@@ -68,11 +59,6 @@ let rec cons : type a. a -> a t -> a t
6859 | Deep (n ,Three (y ,z ,z' ), lazy q' , tail ) ->
6960 _deep (n+ 1 ) (Two (x,y)) (lazy (cons (z,z') q')) tail
7061
71- (* $Q
72- (Q.pair Q.int (Q.list Q.int)) (fun (x,l) -> \
73- cons x (of_list l) |> to_list = x::l)
74- *)
75-
7662let rec snoc : type a . a t -> a -> a t
7763 = fun q x -> match q with
7864 | Shallow Zero -> _single x
@@ -85,19 +71,6 @@ let rec snoc : type a. a t -> a -> a t
8571 | Deep (n ,hd , lazy q' , Three (y ,z ,z' )) ->
8672 _deep (n+ 1 ) hd (lazy (snoc q' (y,z))) (Two (z',x))
8773
88- (* $Q
89- (Q.pair Q.int (Q.list Q.int)) (fun (x,l) -> \
90- snoc (of_list l) x |> to_list = l @ [x])
91- *)
92-
93- (* $R
94- let q = List.fold_left snoc empty [1;2;3;4;5] in
95- let q = tail q in
96- let q = List.fold_left snoc q [6;7;8] in
97- let l = Iter.to_list (to_iter q) in
98- OUnit2.assert_equal ~printer:pp_ilist [2;3;4;5;6;7;8] l
99- *)
100-
10174let rec take_front_exn : 'a . 'a t -> ('a *'a t )
10275 = fun q -> match q with
10376 | Shallow Zero -> raise Empty
@@ -115,30 +88,10 @@ let rec take_front_exn : 'a. 'a t -> ('a *'a t)
11588 | Deep (n ,Three (x ,y ,z ), middle , tail ) ->
11689 x, _deep (n-1 ) (Two (y,z)) middle tail
11790
118- (* $Q
119- (Q.pair Q.int (Q.list Q.int)) (fun (x,l) -> \
120- let x', q = cons x (of_list l) |> take_front_exn in \
121- x'=x && to_list q = l)
122- *)
123-
124- (* $R
125- let q = of_list [1;2;3;4] in
126- let x, q = take_front_exn q in
127- OUnit2.assert_equal 1 x;
128- let q = List.fold_left snoc q [5;6;7] in
129- OUnit2.assert_equal 2 (first_exn q);
130- let x, q = take_front_exn q in
131- OUnit2.assert_equal 2 x;
132- *)
133-
13491let take_front q =
13592 try Some (take_front_exn q)
13693 with Empty -> None
13794
138- (* $T
139- take_front empty = None
140- *)
141-
14295let take_front_l n q =
14396 if n< 0 then (
14497 invalid_arg " take_back_l: cannot take negative number of arguments"
@@ -150,11 +103,6 @@ let take_front_l n q =
150103 aux (x::acc) q' (n-1 )
151104 in aux [] q n
152105
153- (* $T
154- let l, q = take_front_l 5 (1 -- 10) in \
155- l = [1;2;3;4;5] && to_list q = [6;7;8;9;10]
156- *)
157-
158106let take_front_while p q =
159107 let rec aux acc q =
160108 if is_empty q then List. rev acc, q
@@ -163,10 +111,6 @@ let take_front_while p q =
163111 if p x then aux (x::acc) q' else List. rev acc, q
164112 in aux [] q
165113
166- (* $T
167- take_front_while (fun x-> x<5) (1 -- 10) |> fst = [1;2;3;4]
168- *)
169-
170114let rec take_back_exn : 'a . 'a t -> 'a t * 'a
171115 = fun q -> match q with
172116 | Shallow Zero -> raise Empty
@@ -182,20 +126,10 @@ let rec take_back_exn : 'a. 'a t -> 'a t * 'a
182126 | Deep (n , hd , middle , Two(x ,y )) -> _deep (n-1 ) hd middle (One x), y
183127 | Deep (n , hd , middle , Three(x ,y ,z )) -> _deep (n-1 ) hd middle (Two (x,y)), z
184128
185- (* $Q
186- (Q.pair Q.int (Q.list Q.int)) (fun (x,l) -> \
187- let q,x' = snoc (of_list l) x |> take_back_exn in \
188- x'=x && to_list q = l)
189- *)
190-
191129let take_back q =
192130 try Some (take_back_exn q)
193131 with Empty -> None
194132
195- (* $T
196- take_back empty = None
197- *)
198-
199133let take_back_l n q =
200134 if n< 0 then (
201135 invalid_arg " take_back_l: cannot take negative number of arguments"
@@ -240,11 +174,6 @@ let size : 'a. 'a t -> int
240174 | Shallow d -> _size_digit d
241175 | Deep (n , _ , _ , _ ) -> n
242176
243- (* $Q
244- (Q.list Q.int) (fun l -> \
245- size (of_list l) = List.length l)
246- *)
247-
248177let _nth_digit : type l. int -> ('a, l) digit -> 'a = fun i d -> match i, d with
249178 | _ , Zero -> raise Not_found
250179 | 0 , One x -> x
@@ -278,51 +207,24 @@ let rec nth_exn : 'a. int -> 'a t -> 'a
278207 else
279208 _nth_digit (i'- 2 * size q') r
280209
281- (* $T
282- let l = CCList.(0--100) in let q = of_list l in \
283- List.map (fun i->nth_exn i q) l = l
284- *)
285-
286210let nth i q =
287211 try Some (nth_exn i q)
288212 with Failure _ -> None
289213
290- (* $Q & ~count:30
291- (Q.list Q.int) (fun l -> \
292- let len = List.length l in let idx = CCList.(0 -- (len - 1)) in \
293- let q = of_list l in \
294- l = [] || List.for_all (fun i -> nth i q = Some (List.nth l i)) idx)
295- *)
296-
297214let init q =
298215 try fst (take_back_exn q)
299216 with Empty -> q
300217
301- (* $Q
302- (Q.list Q.int) (fun l -> \
303- l = [] || (of_list l |> init |> to_list = List.rev (List.tl (List.rev l))))
304- *)
305-
306218let tail q =
307219 try snd (take_front_exn q)
308220 with Empty -> q
309221
310- (* $Q
311- (Q.list Q.int) (fun l -> \
312- l = [] || (of_list l |> tail |> to_list = List.tl l))
313- *)
314-
315222let add_iter_front seq q =
316223 let l = ref [] in
317224 (* reversed seq *)
318225 seq (fun x -> l := x :: ! l);
319226 List. fold_left (fun q x -> cons x q) q ! l
320227
321- (* $Q
322- Q.(pair (list int) (list int)) (fun (l1, l2) -> \
323- add_iter_front (Iter.of_list l1) (of_list l2) |> to_list = l1 @ l2)
324- *)
325-
326228let add_iter_back q seq =
327229 let q = ref q in
328230 seq (fun x -> q := snoc ! q x);
@@ -342,40 +244,17 @@ let rec to_iter : 'a. 'a t -> 'a iter
342244 to_iter q' (fun (x ,y ) -> k x; k y);
343245 _digit_to_iter tail k
344246
345- (* $Q
346- (Q.list Q.int) (fun l -> \
347- of_list l |> to_iter |> Iter.to_list = l)
348- *)
349-
350247let append q1 q2 =
351248 match q1, q2 with
352249 | Shallow Zero , _ -> q2
353250 | _ , Shallow Zero -> q1
354251 | _ -> add_iter_back q1 (to_iter q2)
355252
356- (* $Q
357- (Q.pair (Q.list Q.int)(Q.list Q.int)) (fun (l1,l2) -> \
358- append (of_list l1) (of_list l2) |> to_list = l1 @ l2)
359- *)
360-
361- (* $R
362- let q1 = of_iter (Iter.of_list [1;2;3;4]) in
363- let q2 = of_iter (Iter.of_list [5;6;7;8]) in
364- let q = append q1 q2 in
365- let l = Iter.to_list (to_iter q) in
366- OUnit2.assert_equal ~printer:pp_ilist [1;2;3;4;5;6;7;8] l
367- *)
368-
369253let add_seq_front seq q =
370254 (* reversed seq *)
371255 let l = Seq. fold_left (fun l elt -> elt::l ) [] seq in
372256 List. fold_left (fun q x -> cons x q) q l
373257
374- (* $Q
375- Q.(pair (list int) (list int)) (fun (l1, l2) -> \
376- add_seq_front (CCList.to_seq l1) (of_list l2) |> to_list = l1 @ l2)
377- *)
378-
379258let add_seq_back q seq =
380259 Seq. fold_left (fun q x -> snoc q x) q seq
381260
@@ -396,11 +275,6 @@ let rec to_seq : 'a. 'a t -> 'a Seq.t
396275
397276let of_seq seq = add_seq_front seq empty
398277
399- (* $Q
400- (Q.list Q.int) (fun l -> \
401- of_list l |> to_seq |> CCList.of_seq = l)
402- *)
403-
404278let _map_digit : type l. ('a -> 'b) -> ('a, l) digit -> ('b, l) digit = fun f d -> match d with
405279 | Zero -> Zero
406280 | One x -> One (f x)
@@ -414,11 +288,6 @@ let rec map : 'a 'b. ('a -> 'b) -> 'a t -> 'b t
414288 let q'' = map (fun (x ,y ) -> f x, f y) q' in
415289 _deep size (_map_digit f hd) (Lazy. from_val q'') (_map_digit f tl)
416290
417- (* $Q
418- (Q.list Q.int) (fun l -> \
419- of_list l |> map string_of_int |> to_list = List.map string_of_int l)
420- *)
421-
422291let (>|=) q f = map f q
423292
424293let _fold_digit : type l. ('acc -> 'a -> 'acc) -> 'acc -> ('a, l) digit -> 'acc = fun f acc d -> match d with
@@ -435,17 +304,6 @@ let rec fold : 'a 'b. ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
435304 let acc = fold (fun acc (x ,y ) -> f (f acc x) y) acc q' in
436305 _fold_digit f acc tl
437306
438- (* $Q
439- (Q.list Q.int) (fun l -> \
440- of_list l |> fold (fun acc x->x::acc) [] = List.rev l)
441- *)
442-
443- (* $R
444- let q = of_iter (Iter.of_list [1;2;3;4]) in
445- let n = fold (+) 0 q in
446- OUnit2.assert_equal 10 n;
447- *)
448-
449307let iter f q = to_iter q f
450308
451309let of_list l = List. fold_left snoc empty l
@@ -457,21 +315,11 @@ let to_list q =
457315
458316let of_iter seq = add_iter_front seq empty
459317
460- (* $Q
461- (Q.list Q.int) (fun l -> \
462- Iter.of_list l |> of_iter |> to_list = l)
463- *)
464-
465318let rev q =
466319 let q' = ref empty in
467320 iter (fun x -> q' := cons x ! q') q;
468321 ! q'
469322
470- (* $Q
471- (Q.list Q.int) (fun l -> \
472- of_list l |> rev |> to_list = List.rev l)
473- *)
474-
475323let rec _equal_seq eq l1 l2 = match l1() , l2() with
476324 | Seq. Nil , Seq. Nil -> true
477325 | Seq. Nil , _
@@ -481,11 +329,6 @@ let rec _equal_seq eq l1 l2 = match l1(), l2() with
481329
482330let equal eq q1 q2 = _equal_seq eq (to_seq q1) (to_seq q2)
483331
484- (* $T
485- let q1 = 1 -- 10 and q2 = append (1 -- 5) (6 -- 10) in \
486- equal (=) q1 q2
487- *)
488-
489332let (--) a b =
490333 let rec up_to q a b = if a = b
491334 then snoc q a
@@ -495,24 +338,11 @@ let (--) a b =
495338 in
496339 if a < = b then up_to empty a b else down_to empty a b
497340
498- (* $T
499- 1 -- 5 |> to_list = [1;2;3;4;5]
500- 5 -- 1 |> to_list = [5;4;3;2;1]
501- 0 -- 0 |> to_list = [0]
502- *)
503-
504341let (--^) a b =
505342 if a= b then empty
506343 else if a< b then a -- (b-1 )
507344 else a -- (b+ 1 )
508345
509- (* $T
510- 1 --^ 5 |> to_list = [1;2;3;4]
511- 5 --^ 1 |> to_list = [5;4;3;2]
512- 1 --^ 2 |> to_list = [1]
513- 0 --^ 0 |> to_list = []
514- *)
515-
516346let pp pp_x out d =
517347 let first = ref true in
518348 Format. fprintf out " @[<hov2>queue {" ;
0 commit comments