let iter f =
    let old, l =
      State.fold
        (fun v elt (old, l) -> match v, old with
         | v, None ->
             assert (l = []);
             Some v, [ elt ]
         | v, (Some old as some) when VarinfoComparable.equal v old ->
             some, elt :: l
         | v, Some old ->
             f old l;
             Some v, [ elt ])
        (None, [])
    in
    Extlib.may (fun v -> f v l) old