[avoid D.Graph.I.run_
Helmut Grohne <grohne@cs.uni-bonn.de>**20150303094310
 Ignore-this: 5ea721392913fbf06bfe9300e0dddd54
 
 This constructs a NodeMap for the graph. It maps node labels to Nodes. Igor2
 already has such a map in its CallDep type. Rather than computing the NodeMap
 on each graph transformation, reuse the information stored in Igor's node map.
 
 This speeds up the test suite by 2%.
 
 It may also solve a space leak in addEdge.
] hunk ./src/Igor2/Data/CallDependencies.hs 223
-addCallUnsafe c@(f1,f2,_) cd =
-    let (CD (Calls cs) ns) = foldl (flip addFunUnsafe) cd [f1,f2] 
-    in CD (Calls (addEdge c cs)) ns
+addCallUnsafe (f1, f2, l) cd =
+    let (n1, cd')              = addFunUnsafe f1 cd
+        (n2, CD (Calls cs) ns) = addFunUnsafe f2 cd'
+        cs' = G.insEdge (n1, n2, l) $ G.delEdge (n1, n2) cs
+    in CD (Calls cs') ns
hunk ./src/Igor2/Data/CallDependencies.hs 231
-addFunUnsafe :: Name -> CallDep -> CallDep
+addFunUnsafe :: Name -> CallDep -> (G.Node, CallDep)
hunk ./src/Igor2/Data/CallDependencies.hs 233
-    if M.member n ns
-      then cd
-      else let (n', cs') = addNode n cs
-               ns' = M.insert n n' ns
-           in CD (Calls cs') ns'
-           
+    case M.lookup n ns of
+      Just n' -> (n', cd)
+      Nothing -> let [n'] = G.newNodes 1 cs
+                     cs'  = G.insNode (n', n) cs
+                 in (n', CD (Calls cs') (M.insert n n' ns))
+
hunk ./src/Igor2/Data/CallDependencies.hs 250
-{-
- |- Unsafe functions to modify a graph
--}
-addNode :: (Ord a) => a -> G.Gr a b -> (G.Node, G.Gr a b)
-addNode n c = let ((n', _), (_, c')) = G.run c $ G.insMapNodeM n in (n', c')
-
-addEdge :: (Ord a) => (a,a,b) -> Gr a b -> Gr a b
-addEdge e@(e1,e2,_) c =  run_ c $
-    do delMapEdgeM (e1,e2)
-       insMapEdgeM e     
-
-