aboutsummaryrefslogtreecommitdiff
path: root/clib
diff options
context:
space:
mode:
authorGaëtan Gilbert2018-06-11 13:57:28 +0200
committerGaëtan Gilbert2019-03-14 15:46:16 +0100
commit06b29ed748a9d9b99c2c08a3788906dbad5417d2 (patch)
tree5623fad28f68f9450ab7122f595ec1727f8f52bf /clib
parent71b9ad8526155020c8451dd326a52e391a9a8585 (diff)
Repair relevance marks in-kernel.
Prevent errors when under annotating binders.
Diffstat (limited to 'clib')
-rw-r--r--clib/cArray.ml31
-rw-r--r--clib/cArray.mli2
2 files changed, 33 insertions, 0 deletions
diff --git a/clib/cArray.ml b/clib/cArray.ml
index 145a32cf45..774e3a56a6 100644
--- a/clib/cArray.ml
+++ b/clib/cArray.ml
@@ -68,6 +68,7 @@ sig
module Smart :
sig
val map : ('a -> 'a) -> 'a array -> 'a array
+ val map_i : (int -> 'a -> 'a) -> 'a array -> 'a array
val map2 : ('a -> 'b -> 'b) -> 'a array -> 'b array -> 'b array
val fold_left_map : ('a -> 'b -> 'a * 'b) -> 'a -> 'b array -> 'a * 'b array
val fold_left2_map : ('a -> 'b -> 'c -> 'a * 'c) -> 'a -> 'b array -> 'c array -> 'a * 'c array
@@ -482,6 +483,36 @@ struct
ans
end else ar
+ (* Same as map_i but smart *)
+ let map_i f (ar : 'a array) =
+ let len = Array.length ar in
+ let i = ref 0 in
+ let break = ref true in
+ let temp = ref None in
+ while !break && (!i < len) do
+ let v = Array.unsafe_get ar !i in
+ let v' = f !i v in
+ if v == v' then incr i
+ else begin
+ break := false;
+ temp := Some v';
+ end
+ done;
+ if !i < len then begin
+ (* The array is not the same as the original one *)
+ let ans : 'a array = Array.copy ar in
+ let v = match !temp with None -> assert false | Some x -> x in
+ Array.unsafe_set ans !i v;
+ incr i;
+ while !i < len do
+ let v = Array.unsafe_get ans !i in
+ let v' = f !i v in
+ if v != v' then Array.unsafe_set ans !i v';
+ incr i
+ done;
+ ans
+ end else ar
+
let map2 f aux_ar ar =
let len = Array.length ar in
let aux_len = Array.length aux_ar in
diff --git a/clib/cArray.mli b/clib/cArray.mli
index 8aca31ad33..c1b29bb9d3 100644
--- a/clib/cArray.mli
+++ b/clib/cArray.mli
@@ -129,6 +129,8 @@ sig
(** [Smart.map f a] behaves as [map f a] but returns [a] instead of a copy when
[f x == x] for all [x] in [a]. *)
+ val map_i : (int -> 'a -> 'a) -> 'a array -> 'a array
+
val map2 : ('a -> 'b -> 'b) -> 'a array -> 'b array -> 'b array
(** [Smart.map2 f a b] behaves as [map2 f a b] but returns [a] instead of a copy when
[f x y == y] for all [x] in [a] and [y] in [b] pointwise. *)