X-Git-Url: http://nitlanguage.org diff --git a/lib/poset.nit b/lib/poset.nit index 568f968..3288e5c 100644 --- a/lib/poset.nit +++ b/lib/poset.nit @@ -149,20 +149,37 @@ class POSet[E] # Update the transitive reduction if te.tos.has(f) then return # Skip the reduction if there is a loop - for x in te.dfroms.to_a do + # Remove transitive edges. + # Because the sets of direct is iterated, the list of edges to remove + # is stored and is applied after the iteration. + # The usual case is that no direct edges need to be removed, + # so start with a `null` list of edges. + var to_remove: nullable Array[E] = null + for x in te.dfroms do var xe = self.elements[x] if xe.tos.has(f) then - te.dfroms.remove(x) + if to_remove == null then to_remove = new Array[E] + to_remove.add x xe.dtos.remove(t) end end - for x in fe.dtos.to_a do + if to_remove != null then + for x in to_remove do te.dfroms.remove(x) + to_remove.clear + end + + for x in fe.dtos do var xe = self.elements[x] if xe.froms.has(t) then xe.dfroms.remove(f) - fe.dtos.remove(x) + if to_remove == null then to_remove = new Array[E] + to_remove.add x end end + if to_remove != null then + for x in to_remove do fe.dtos.remove(x) + end + fe.dtos.add t te.dfroms.add f end @@ -228,7 +245,7 @@ class POSet[E] # # Nodes are labeled with their `to_s` so homonymous nodes may appear. # Edges are unlabeled. - fun write_dot(f: OStream) + fun write_dot(f: Writer) do f.write "digraph \{\n" var ids = new HashMap[E, Int] @@ -258,7 +275,7 @@ class POSet[E] # See `write_dot` for details. fun show_dot do - var f = new OProcess("dot", "-Txlib") + var f = new ProcessWriter("dot", "-Txlib") write_dot(f) f.close f.wait