]> matita.cs.unibo.it Git - helm.git/commitdiff
new sharing-preserving map with accumulator
authorEnrico Tassi <enrico.tassi@inria.fr>
Wed, 21 Oct 2009 09:09:47 +0000 (09:09 +0000)
committerEnrico Tassi <enrico.tassi@inria.fr>
Wed, 21 Oct 2009 09:09:47 +0000 (09:09 +0000)
helm/software/components/extlib/hExtlib.ml
helm/software/components/extlib/hExtlib.mli

index cccb467674e22415b59de320e72cbbe845812142..237d4e77f34e2e1611fa8d04ab5639932fd24f2b 100644 (file)
@@ -211,6 +211,19 @@ let sharing_map f l =
   if !unchanged then l else l1
 ;;
         
+let sharing_map_acc f acc l =
+  let unchanged = ref true in
+  let final_acc = ref acc in
+  let rec aux b acc = function
+    | [] as t -> unchanged := b; final_acc := acc; t
+    | he::tl ->
+        let acc, he1 = f acc he in
+        he1 :: aux (b && he1 == he) acc tl
+  in
+  let l1 = aux true acc l in
+  !final_acc, if !unchanged then l else l1
+;;
+
 let rec list_uniq ?(eq=(=)) = function 
   | [] -> []
   | h::[] -> [h]
index f5e3741d44a5e4f082ced3c3e3e3d99448fb8fe1..34b4e3103680d0ae90a02882e9d53e09d0f3bd54 100644 (file)
@@ -102,6 +102,8 @@ val list_mapi_acc:
 (* Finds the zero based index of the first element that satisfies a predicate*)
 val list_index: ('a -> bool) -> 'a list -> (int * 'a) option
 val sharing_map: ('a -> 'a) -> 'a list -> 'a list
+val sharing_map_acc: 
+     ('acc -> 'a -> 'acc * 'a) -> 'acc -> 'a list -> 'acc * 'a list
 (* Iters in parallel on two lists until the first list is empty.
    The second one can be shorter and is padded with a default value.
    This function cannot fail. *)