aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/util.ml18
-rw-r--r--lib/util.mli1
2 files changed, 19 insertions, 0 deletions
diff --git a/lib/util.ml b/lib/util.ml
index e17e586c20..c733ed3335 100644
--- a/lib/util.ml
+++ b/lib/util.ml
@@ -141,6 +141,24 @@ let list_fold_left_i f =
in
it_list_f
+(* [list_fold_right_and_left f [a1;...;an] hd =
+ f (f (... (f (f hd
+ an
+ [an-1;...;a1])
+ an-1
+ [an-2;...;a1])
+ ...)
+ a2
+ [a1])
+ a1
+ []] *)
+
+let rec list_fold_right_and_left f l hd =
+ let rec aux tl = function
+ | [] -> hd
+ | a::l -> let hd = aux (a::tl) l in f hd a tl
+ in aux [] l
+
let list_iter_i f l = list_fold_left_i (fun i _ x -> f i x) 0 () l
let list_for_all_i p =
diff --git a/lib/util.mli b/lib/util.mli
index 35d181098d..22953788af 100644
--- a/lib/util.mli
+++ b/lib/util.mli
@@ -58,6 +58,7 @@ val list_map2_i :
val list_index : 'a -> 'a list -> int
val list_iter_i : (int -> 'a -> unit) -> 'a list -> unit
val list_fold_left_i : (int -> 'a -> 'b -> 'a) -> int -> 'a -> 'b list -> 'a
+val list_fold_left_right : ('a -> 'b -> 'b list -> 'a) -> 'b list -> 'a -> 'a
val list_for_all_i : (int -> 'a -> bool) -> int -> 'a list -> bool
val list_except : 'a -> 'a list -> 'a list
val list_for_all2eq : ('a -> 'b -> bool) -> 'a list -> 'b list -> bool