mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 19:25:28 -05:00
add CCList.fold_filter_map
This commit is contained in:
parent
eea9d8139e
commit
22b001c600
2 changed files with 20 additions and 0 deletions
|
|
@ -174,6 +174,21 @@ let fold_map2 f acc l1 l2 =
|
||||||
with Invalid_argument _ -> true)
|
with Invalid_argument _ -> true)
|
||||||
*)
|
*)
|
||||||
|
|
||||||
|
let fold_filter_map f acc l =
|
||||||
|
let rec aux f acc map_acc l = match l with
|
||||||
|
| [] -> acc, List.rev map_acc
|
||||||
|
| x :: l' ->
|
||||||
|
let acc, y = f acc x in
|
||||||
|
aux f acc (cons_maybe y map_acc) l'
|
||||||
|
in
|
||||||
|
aux f acc [] l
|
||||||
|
|
||||||
|
(*$= & ~printer:Q.Print.(pair int (list int))
|
||||||
|
(List.fold_left (+) 0 (1--10), [2;4;6;8;10]) \
|
||||||
|
(fold_filter_map (fun acc x -> acc+x, if x mod 2 = 0 then Some x else None) \
|
||||||
|
0 (1--10))
|
||||||
|
*)
|
||||||
|
|
||||||
let fold_flat_map f acc l =
|
let fold_flat_map f acc l =
|
||||||
let rec aux f acc map_acc l = match l with
|
let rec aux f acc map_acc l = match l with
|
||||||
| [] -> acc, List.rev map_acc
|
| [] -> acc, List.rev map_acc
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,11 @@ val fold_map2 : ('acc -> 'a -> 'b -> 'acc * 'c) -> 'acc -> 'a list -> 'b list ->
|
||||||
@raise Invalid_argument if the lists do not have the same length
|
@raise Invalid_argument if the lists do not have the same length
|
||||||
@since 0.16 *)
|
@since 0.16 *)
|
||||||
|
|
||||||
|
val fold_filter_map : ('acc -> 'a -> 'acc * 'b option) -> 'acc -> 'a list -> 'acc * 'b list
|
||||||
|
(** [fold_filter_map f acc l] is a [fold_left]-like function, but also
|
||||||
|
generates a list of output in a way similar to {!filter_map}
|
||||||
|
@since NEXT_RELEASE *)
|
||||||
|
|
||||||
val fold_flat_map : ('acc -> 'a -> 'acc * 'b list) -> 'acc -> 'a list -> 'acc * 'b list
|
val fold_flat_map : ('acc -> 'a -> 'acc * 'b list) -> 'acc -> 'a list -> 'acc * 'b list
|
||||||
(** [fold_flat_map f acc l] is a [fold_left]-like function, but it also maps the
|
(** [fold_flat_map f acc l] is a [fold_left]-like function, but it also maps the
|
||||||
list to a list of lists that is then [flatten]'d..
|
list to a list of lists that is then [flatten]'d..
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue