From ae390d34f4a6b9f58af50a3d25b36448b6536d98 Mon Sep 17 00:00:00 2001 From: Drup Date: Fri, 8 Aug 2014 20:37:54 +0200 Subject: [PATCH 1/2] Add on_list. --- sequence.ml | 9 +++++---- sequence.mli | 5 +++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/sequence.ml b/sequence.ml index 9e5fb84..d9bc87e 100644 --- a/sequence.ml +++ b/sequence.ml @@ -436,14 +436,17 @@ let to_list seq = List.rev (fold (fun y x -> x::y) [] seq) let to_rev_list seq = fold (fun y x -> x :: y) [] seq +let of_list l k = List.iter k l + +let on_list f l = + to_list (f (of_list l)) + let to_opt = head let of_opt o k = match o with | None -> () | Some x -> k x -let of_list l k = List.iter k l - let to_array seq = let l = MList.of_seq seq in let n = MList.length l in @@ -767,5 +770,3 @@ module IO = struct let write_lines ?mode ?flags filename seq = write_to ?mode ?flags filename (snoc (intersperse "\n" seq) "\n") end - - diff --git a/sequence.mli b/sequence.mli index 2d8ee31..e81a729 100644 --- a/sequence.mli +++ b/sequence.mli @@ -319,6 +319,11 @@ val to_rev_list : 'a t -> 'a list val of_list : 'a list -> 'a t +val on_list : ('a t -> 'b t) -> 'a list -> 'b list +(** [on_list f l] is equivalent to [to_list @@ f @@ of_list l]. + @since NEXT_RELEASE +*) + val to_opt : 'a t -> 'a option (** Alias to {!head} @since NEXT_RELEASE *) From 81d73150002b0fa1c26cdd8b3e8729735c204612 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Fri, 8 Aug 2014 23:47:51 +0200 Subject: [PATCH 2/2] bugfix: take would fail on 0 --- sequence.ml | 2 +- tests/test_sequence.ml | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/sequence.ml b/sequence.ml index d9bc87e..54ed7e8 100644 --- a/sequence.ml +++ b/sequence.ml @@ -336,9 +336,9 @@ let take n seq k = let count = ref 0 in try seq (fun x -> + if !count = n then raise ExitSequence; incr count; k x; - if !count = n then raise ExitSequence ) with ExitSequence -> () diff --git a/tests/test_sequence.ml b/tests/test_sequence.ml index bfd7dac..1b6c862 100644 --- a/tests/test_sequence.ml +++ b/tests/test_sequence.ml @@ -190,6 +190,13 @@ let test_int_range () = OUnit.assert_equal ~printer:pp_ilist [] S.(to_list (10 --^ 60)); () +let test_take () = + let l = S.(to_list (take 0 (of_list [1]))) in + OUnit.assert_equal ~printer:pp_ilist [] l; + let l = S.(to_list (take 5 (of_list [1;2;3;4;5;6;7;8;9;10]))) in + OUnit.assert_equal ~printer:pp_ilist [1;2;3;4;5] l; + () + let suite = "test_sequence" >::: [ "test_empty" >:: test_empty; @@ -217,4 +224,5 @@ let suite = "test_unfoldr" >:: test_unfoldr; "test_hashtbl" >:: test_hashtbl; "test_int_range" >:: test_int_range; + "test_take" >:: test_take; ]