open CCSeq module T = (val Containers_testlib.make ~__FILE__ ()) include T;; t @@ fun () -> repeat ~n:4 0 |> to_list = [ 0; 0; 0; 0 ];; t @@ fun () -> repeat ~n:0 1 |> to_list = [];; t @@ fun () -> repeat 1 |> take 20 |> to_list = (repeat ~n:20 1 |> to_list);; t @@ fun () -> of_list [ 1; 2; 3; 4 ] |> take_while (fun x -> x < 4) |> to_list = [ 1; 2; 3 ] ;; q (Q.pair (Q.list Q.small_int) Q.small_int) (fun (l, n) -> let s = of_list l in let s1, s2 = take n s, drop n s in append s1 s2 |> to_list = l) ;; t @@ fun () -> map (( + ) 1) (1 -- 5) |> to_list = (2 -- 6 |> to_list);; t @@ fun () -> mapi (fun i x -> i, x) (1 -- 3) |> to_list = [ 0, 1; 1, 2; 2, 3 ] ;; t @@ fun () -> fmap (fun x -> if x mod 2 = 0 then Some (x * 3) else None) (1 -- 10) |> to_list = [ 6; 12; 18; 24; 30 ] ;; t @@ fun () -> cycle (of_list [ 1; 2 ]) |> take 5 |> to_list = [ 1; 2; 1; 2; 1 ] ;; t @@ fun () -> cycle (of_list [ 1; ~-1 ]) |> take 100_000 |> fold ( + ) 0 = 0;; t @@ fun () -> let f = function | 10 -> None | x -> Some (x, x + 1) in unfold f 0 |> to_list = [ 0; 1; 2; 3; 4; 5; 6; 7; 8; 9 ] ;; t @@ fun () -> for_all (( = ) 1) (of_list []) = true;; t @@ fun () -> for_all (( = ) 1) (of_list [ 0 ]) = false;; t @@ fun () -> for_all (( = ) 1) (of_list [ 1 ]) = true;; t @@ fun () -> for_all (( = ) 1) (of_list [ 1; 0 ]) = false;; t @@ fun () -> for_all (( = ) 1) (of_list [ 0; 1 ]) = false;; t @@ fun () -> for_all (( = ) 1) (of_list [ 1; 1 ]) = true;; t @@ fun () -> let l () = Cons (0, fun () -> failwith "no second element") in try ignore (for_all (( = ) 1) l); true with Failure _ -> false ;; t @@ fun () -> exists (( = ) 1) (of_list []) = false;; t @@ fun () -> exists (( = ) 1) (of_list [ 0 ]) = false;; t @@ fun () -> exists (( = ) 1) (of_list [ 1 ]) = true;; t @@ fun () -> exists (( = ) 1) (of_list [ 1; 0 ]) = true;; t @@ fun () -> exists (( = ) 1) (of_list [ 0; 1 ]) = true;; t @@ fun () -> exists (( = ) 1) (of_list [ 0; 0 ]) = false;; t @@ fun () -> let l () = Cons (1, fun () -> failwith "no second element") in try ignore (exists (( = ) 1) l); true with Failure _ -> false ;; t @@ fun () -> of_list [ 1; 1; 1; 2; 2; 3; 3; 1 ] |> group ( = ) |> map to_list |> to_list = [ [ 1; 1; 1 ]; [ 2; 2 ]; [ 3; 3 ]; [ 1 ] ] ;; t @@ fun () -> range 0 5 |> to_list = [ 0; 1; 2; 3; 4; 5 ];; t @@ fun () -> range 0 0 |> to_list = [ 0 ];; t @@ fun () -> range 5 2 |> to_list = [ 5; 4; 3; 2 ];; t @@ fun () -> 1 --^ 5 |> to_list = [ 1; 2; 3; 4 ];; t @@ fun () -> 5 --^ 1 |> to_list = [ 5; 4; 3; 2 ];; t @@ fun () -> 1 --^ 2 |> to_list = [ 1 ];; t @@ fun () -> 0 --^ 0 |> to_list = [];; q Q.(list (pair int int)) (fun l -> let l = of_list l in let a, b = unzip l in equal ( = ) l (zip a b)) ;; eq [ 0, 'a'; 1, 'b'; 2, 'c' ] (of_string "abcde" |> zip_i |> take 3 |> to_list) ;; q Q.(array int) (fun a -> of_array a |> to_array = a);; t @@ fun () -> of_array [| 1; 2; 3 |] |> to_list = [ 1; 2; 3 ];; t @@ fun () -> of_list [ 1; 2; 3 ] |> to_array = [| 1; 2; 3 |];; t @@ fun () -> let r = ref 1 in let s = unfold (fun i -> if i < 3 then ( let x = !r in incr r; Some (x, succ i) ) else None) 0 in to_array s = [| 1; 2; 3 |] ;; t @@ fun () -> let g = let n = ref 0 in fun () -> Some (incr n; !n) in let l = of_gen g in assert_equal [ 1; 2; 3; 4; 5; 6; 7; 8; 9; 10 ] (take 10 l |> to_list); assert_equal [ 1; 2; 3; 4; 5; 6; 7; 8; 9; 10 ] (take 10 l |> to_list); assert_equal [ 11; 12 ] (drop 10 l |> take 2 |> to_list); true ;; t @@ fun () -> let printer = Q.Print.(list int) in let gen () = let rec l = let r = ref 0 in fun () -> incr r; Cons (!r, l) in l in let l1 = gen () in assert_equal ~printer [ 1; 2; 3; 4 ] (take 4 l1 |> to_list); assert_equal ~printer [ 5; 6; 7; 8 ] (take 4 l1 |> to_list); let l2 = gen () |> memoize in assert_equal ~printer [ 1; 2; 3; 4 ] (take 4 l2 |> to_list); assert_equal ~printer [ 1; 2; 3; 4 ] (take 4 l2 |> to_list); true ;; t @@ fun () -> interleave (of_list [ 1; 3; 5 ]) (of_list [ 2; 4; 6 ]) |> to_list = [ 1; 2; 3; 4; 5; 6 ] ;; t @@ fun () -> fair_app (of_list [ ( + ) 1; ( * ) 3 ]) (of_list [ 1; 10 ]) |> to_list |> List.sort Stdlib.compare = [ 2; 3; 11; 30 ]