aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorherbelin2000-06-29 18:21:06 +0000
committerherbelin2000-06-29 18:21:06 +0000
commitac7f047a00909fa1bdfbd3d28cb06060b1df42f2 (patch)
treef8f365ac6509730067ccf47d810c8a6482107186 /lib
parent3020db6f39d08648f1f8deaf9995659a0eea70db (diff)
Ajout list_fold_right_and_left
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@535 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'lib')
-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