add many missing functions to CCListLabels

This commit is contained in:
Simon Cruanes 2018-04-08 18:54:56 -05:00
parent fac9f18031
commit 33d3ee114c
2 changed files with 61 additions and 7 deletions

View file

@ -1592,3 +1592,4 @@ let pp ?(start="") ?(stop="") ?(sep=", ") pp_item fmt l =
(CCFormat.hbox(CCList.pp ~start:"[" ~stop:"]" CCFormat.int)) \ (CCFormat.hbox(CCList.pp ~start:"[" ~stop:"]" CCFormat.int)) \
[1;2;3]) [1;2;3])
*) *)

View file

@ -3,6 +3,12 @@
(** {1 Complements to list} *) (** {1 Complements to list} *)
type 'a sequence = ('a -> unit) -> unit
type 'a gen = unit -> 'a option
type 'a klist = unit -> [`Nil | `Cons of 'a * 'a klist]
type 'a printer = Format.formatter -> 'a -> unit
type 'a random_gen = Random.State.t -> 'a
include module type of ListLabels include module type of ListLabels
type 'a t = 'a list type 'a t = 'a list
@ -59,6 +65,9 @@ val fold_map : f:('acc -> 'a -> 'acc * 'b) -> init:'acc -> 'a list -> 'acc * 'b
list to another list. list to another list.
@since 0.14 *) @since 0.14 *)
val scan_left : f:('acc -> 'a -> 'acc) -> init:'acc -> 'a list -> 'acc list
(** @since NEXT_RELEASE *)
val fold_map2 : f:('acc -> 'a -> 'b -> 'acc * 'c) -> init:'acc -> 'a list -> 'b list -> 'acc * 'c list val fold_map2 : f:('acc -> 'a -> 'b -> 'acc * 'c) -> init:'acc -> 'a list -> 'b list -> 'acc * 'c list
(** [fold_map2] is to [fold_map] what [List.map2] is to [List.map]. (** [fold_map2] is to [fold_map] what [List.map2] is to [List.map].
@raise Invalid_argument if the lists do not have the same length. @raise Invalid_argument if the lists do not have the same length.
@ -74,13 +83,31 @@ val fold_flat_map : f:('acc -> 'a -> 'acc * 'b list) -> init:'acc -> 'a list ->
list to a list of lists that is then [flatten]'d. list to a list of lists that is then [flatten]'d.
@since 0.14 *) @since 0.14 *)
val count : f:('a -> bool) -> 'a list -> int
(** @since NEXT_RELEASE *)
val init : int -> f:(int -> 'a) -> 'a t val init : int -> f:(int -> 'a) -> 'a t
(** [init len ~f] is [f 0; f 1; ...; f (len-1)]. (** [init len ~f] is [f 0; f 1; ...; f (len-1)].
@raise Invalid_argument if len < 0. @raise Invalid_argument if len < 0.
@since 0.6 *) @since 0.6 *)
val combine : 'a list -> 'b list -> ('a * 'b) list
(** @since NEXT_RELEASE *)
val combine_gen : 'a list -> 'b list -> ('a * 'b) gen
(** @since NEXT_RELEASE *)
val split : ('a * 'b) t -> 'a t * 'b t
(** @since NEXT_RELEASE *)
val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int
val compare_lengths : 'a t -> 'b t -> int
(** @since NEXT_RELEASE *)
val compare_length_with : 'a t -> int -> int
(** @since NEXT_RELEASE *)
val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
val flat_map : f:('a -> 'b t) -> 'a t -> 'b t val flat_map : f:('a -> 'b t) -> 'a t -> 'b t
@ -95,6 +122,11 @@ val product : f:('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
val fold_product : f:('c -> 'a -> 'b -> 'c) -> init:'c -> 'a t -> 'b t -> 'c val fold_product : f:('c -> 'a -> 'b -> 'c) -> init:'c -> 'a t -> 'b t -> 'c
(** Fold on the cartesian product. *) (** Fold on the cartesian product. *)
val cartesian_product : 'a t t -> 'a t t
(** @since NEXT_RELEASE *)
val map_product_l : f:('a -> 'b list) -> 'a list -> 'b list list
(** @since NEXT_RELEASE *)
val diagonal : 'a t -> ('a * 'a) t val diagonal : 'a t -> ('a * 'a) t
(** All pairs of distinct positions of the list. [list_diagonal l] will (** All pairs of distinct positions of the list. [list_diagonal l] will
return the list of [List.nth i l, List.nth j l] if [i < j]. *) return the list of [List.nth i l, List.nth j l] if [i < j]. *)
@ -121,7 +153,7 @@ val sublists_of_len :
@since 1.5 *) @since 1.5 *)
val intersperse : 'a -> 'a list -> 'a list val intersperse : x:'a -> 'a list -> 'a list
(** Insert the first argument between every element of the list. (** Insert the first argument between every element of the list.
@since NEXT_RELEASE *) @since NEXT_RELEASE *)
@ -168,6 +200,9 @@ val drop_while : f:('a -> bool) -> 'a t -> 'a t
(** [drop_while ~f l] drops the longest prefix of [l] for which [f] is [true]. (** [drop_while ~f l] drops the longest prefix of [l] for which [f] is [true].
@since 0.13 *) @since 0.13 *)
val take_drop_while : f:('a -> bool) -> 'a t -> 'a t * 'a t
(** @since NEXT_RELEASE *)
val last : int -> 'a t -> 'a t val last : int -> 'a t -> 'a t
(** [last n l] takes the last [n] elements of [l] (or less if (** [last n l] takes the last [n] elements of [l] (or less if
[l] doesn't have that many elements). *) [l] doesn't have that many elements). *)
@ -189,6 +224,9 @@ val find_pred : f:('a -> bool) -> 'a t -> 'a option
or returns [None] if no element satisfies [p]. or returns [None] if no element satisfies [p].
@since 0.11 *) @since 0.11 *)
val find_opt : f:('a -> bool) -> 'a t -> 'a option
(** @since NEXT_RELEASE *)
val find_pred_exn : f:('a -> bool) -> 'a t -> 'a val find_pred_exn : f:('a -> bool) -> 'a t -> 'a
(** Unsafe version of {!find_pred}. (** Unsafe version of {!find_pred}.
@raise Not_found if no such element is found. @raise Not_found if no such element is found.
@ -218,6 +256,18 @@ val filter_map : f:('a -> 'b option) -> 'a t -> 'b t
[f] returns [Some e]. [f] returns [Some e].
Map and remove elements at the same time. *) Map and remove elements at the same time. *)
val keep_some : 'a option t -> 'a t
(** @since NEXT_RELEASE *)
val keep_ok : ('a, _) Result.result t -> 'a t
(** @since NEXT_RELEASE *)
val all_some : 'a option t -> 'a t option
(** @since NEXT_RELEASE *)
val all_ok : ('a, 'err) Result.result t -> ('a t, 'err) Result.result
(** @since NEXT_RELEASE *)
val sorted_merge : cmp:('a -> 'a -> int) -> 'a list -> 'a list -> 'a list val sorted_merge : cmp:('a -> 'a -> int) -> 'a list -> 'a list -> 'a list
(** Merges elements from both sorted list. *) (** Merges elements from both sorted list. *)
@ -265,14 +315,23 @@ val iteri : f:(int -> 'a -> unit) -> 'a t -> unit
the element as first argument (counting from 0), and the element the element as first argument (counting from 0), and the element
itself as second argument. *) itself as second argument. *)
val iteri2 : f:(int -> 'a -> 'b -> unit) -> 'a t -> 'b t -> unit
(** @since NEXT_RELEASE *)
val foldi : f:('b -> int -> 'a -> 'b) -> init:'b -> 'a t -> 'b val foldi : f:('b -> int -> 'a -> 'b) -> init:'b -> 'a t -> 'b
(** Like [fold] but it also passes in the index of each element to the folded function. Tail-recursive. *) (** Like [fold] but it also passes in the index of each element to the folded function. Tail-recursive. *)
val foldi2 : f:('c -> int -> 'a -> 'b -> 'c) -> init:'c -> 'a t -> 'b t -> 'c
(** @since NEXT_RELEASE *)
val get_at_idx : int -> 'a t -> 'a option val get_at_idx : int -> 'a t -> 'a option
(** Get by index in the list. (** Get by index in the list.
If the index is negative, it will get element starting from the end If the index is negative, it will get element starting from the end
of the list. *) of the list. *)
val nth_opt : 'a t -> int -> 'a option
(** @since NEXT_RELEASE *)
val get_at_idx_exn : int -> 'a t -> 'a val get_at_idx_exn : int -> 'a t -> 'a
(** Get the i-th element, or (** Get the i-th element, or
@raise Not_found if the index is invalid. @raise Not_found if the index is invalid.
@ -463,12 +522,6 @@ end
(** {2 Conversions} *) (** {2 Conversions} *)
type 'a sequence = ('a -> unit) -> unit
type 'a gen = unit -> 'a option
type 'a klist = unit -> [`Nil | `Cons of 'a * 'a klist]
type 'a printer = Format.formatter -> 'a -> unit
type 'a random_gen = Random.State.t -> 'a
val random : 'a random_gen -> 'a t random_gen val random : 'a random_gen -> 'a t random_gen
val random_non_empty : 'a random_gen -> 'a t random_gen val random_non_empty : 'a random_gen -> 'a t random_gen
val random_len : int -> 'a random_gen -> 'a t random_gen val random_len : int -> 'a random_gen -> 'a t random_gen