aboutsummaryrefslogtreecommitdiff
path: root/kernel/pre_env.ml
diff options
context:
space:
mode:
authorPierre-Marie Pédrot2016-08-22 14:39:10 +0200
committerPierre-Marie Pédrot2016-09-09 12:03:25 +0200
commit37195c027472b7f0110249b28356271e713fee6f (patch)
tree26eeac7ec60bd309d26c673462e369c0239652b7 /kernel/pre_env.ml
parent76370ea2ddc2c09485f02c86798914a6d4cf5523 (diff)
More efficient implementation of map_named_val.
Diffstat (limited to 'kernel/pre_env.ml')
-rw-r--r--kernel/pre_env.ml15
1 files changed, 14 insertions, 1 deletions
diff --git a/kernel/pre_env.ml b/kernel/pre_env.ml
index 62e5cd3662..defc0afc8e 100644
--- a/kernel/pre_env.ml
+++ b/kernel/pre_env.ml
@@ -132,7 +132,7 @@ let env_of_rel n env =
(* Named context *)
let push_named_context_val_val d rval ctxt =
- assert (not (Id.Map.mem (get_id d) ctxt.env_named_map));
+(* assert (not (Id.Map.mem (get_id d) ctxt.env_named_map)); *)
{
env_named_ctx = Context.Named.add d ctxt.env_named_ctx;
env_named_val = (get_id d, rval) :: ctxt.env_named_val;
@@ -150,6 +150,19 @@ let match_named_context_val c = match c.env_named_ctx, c.env_named_val with
Some (decl, v, cval)
| _ -> assert false
+let map_named_val f ctxt =
+ let open Context.Named.Declaration in
+ let fold accu d =
+ let d' = map_constr f d in
+ let accu =
+ if d == d' then accu
+ else Id.Map.modify (get_id d) (fun _ (_, v) -> (d', v)) accu
+ in
+ (accu, d')
+ in
+ let map, ctx = List.fold_map fold ctxt.env_named_map ctxt.env_named_ctx in
+ { ctxt with env_named_ctx = ctx; env_named_map = map }
+
let push_named d env =
(* if not (env.env_rel_context = []) then raise (ASSERT env.env_rel_context);
assert (env.env_rel_context = []); *)