let iter f =
    let old, l =
      IState.fold
        (fun v elt (old, l) -> match v, old with
        | v, None ->
          assert (l = []);
          Some v, [ elt ]
        | v, (Some old as some) when Varinfo.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