Skip to content

Commit 8b43d5a

Browse files
committed
Refactor add_ids_from_auto_term to preserve existing models and optimize ID membership checks
1 parent 52147a3 commit 8b43d5a

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

src/haz3lcore/ProbePerform.re

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -316,19 +316,29 @@ let add_ids_from_auto_term =
316316
(~syntax: CachedSyntax.t, ~info_map: Statics.Map.t, z: Zipper.t): Zipper.t => {
317317
let auto_ids = Id.Map.bindings(z.refractors.autos.ids) |> List.map(fst);
318318
let ids = List.concat_map(ids_from_term(~syntax, ~info_map), auto_ids);
319+
/* Build a set for O(log n) membership checks */
320+
let new_ids_set =
321+
List.fold_left((map, id) => Id.Map.add(id, (), map), Id.Map.empty, ids);
319322
Zipper.update_ephemerals(
320-
old_ephemerals =>
323+
old_ephemerals => {
324+
/* Keep existing entries that are still valid (preserves models) */
325+
let kept =
326+
Id.Map.filter(
327+
(id, _) => Id.Map.mem(id, new_ids_set),
328+
old_ephemerals,
329+
);
330+
/* Add new entries only for IDs not already present */
321331
List.fold_left(
322-
(map, id) => {
323-
/* Preserve existing model if present */
324-
let model =
325-
Id.Map.find_opt(id, old_ephemerals)
326-
|> Option.map((entry: Refractors.entry) => entry.model);
327-
Id.Map.add(id, Refractors.mk_entry(~model?, Probe), map);
328-
},
329-
Id.Map.empty,
332+
(map, id) =>
333+
if (Id.Map.mem(id, map)) {
334+
map; /* Already exists with model, keep it */
335+
} else {
336+
Id.Map.add(id, Refractors.mk_entry(Probe), map);
337+
},
338+
kept,
330339
ids,
331-
),
340+
);
341+
},
332342
z,
333343
);
334344
};

0 commit comments

Comments
 (0)