úÎ&(Ô8      !"#$%&'()*+,-./01234567 Safe-Inferred 89:;<=>?@89:89:;<=>?@ Safe-InferredABCDEFGHABCDEFABCDEFGH Safe-InferredI3New improved ugly version with caller function nameJ>The set of keys must be equal and this is checked dynamically. IKJLMNOPQRST IKJLMNOPQRST IKJLMNOPQRST Safe-Inferred The index map must be an injection, that is, nodes must not collaps. Also the node and edge index maps must be consistent, i.e. Ifrom (edgeMap e) == nodeMap (from e) to (edgeMap e) == nodeMap (to e)pStrictly spoken, we would need the node map only for isolated nodes, but we use it for all nodes for simplicity.The node sets must be disjoint.!Node and edge sets must be equal.U$Alternative implementation for test:"2Node to be deleted must be contained in the graph.#&Could be implemented more efficiently.&ŠYou may only use this for filtering edges and use more specialised types as a result. You must not alter source and target nodes of edges.(àIn the current implementation existing nodes are replaced with new labels and existing edges are maintained. However, I think we should better have an extra function for this purpose and you should not rely on this behavior.*¾In the current implementation existing edges are replaced with new labels. However, I think we should better have an extra function for this purpose and you should not rely on this behavior.3Same restrictions as in 5.4Same restrictions as in 5.5.Don't rely on a particular order of traversal!V.Don't rely on a particular order of traversal!_W XYZ[U \]!^"#$%&'()*+,_-./012345V67`abcdefghijklmnopqrstuvwxyz{8  !"#$%&'()*+,-./012345678  +,1 !67-./02%345&'"#$()*VW  XYZ[U \]!^"#$%&'()*+,_-./012345V67`abcdefghijklmnopqrstuvwxyz{|        !"#$%&'()*+,-./0123456789:;;<=>?@ABCCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyzcomfort-graph-0.0Data.Graph.Comfort"Data.Graph.Comfort.TypeConstructorData.Graph.Comfort.TotalMapData.Graph.Comfort.MapInOutReverse reverseEdge EitherEdge EUndirEdgeEDirEdge UndirEdgeDirEdge LabeledEdgeEdgefromto LabeledNodeGraph isConsistent undirEdgegraphMapnodes nodeEdges edgeLabelsedgeSetedgesreversemapKeysemptyunioncheckedZipWith nodeLabels lookupEdgeisEmpty lookupNode adjacentEdges deleteNode deleteNodeSet deleteEdgefilterEdgeWithKeymapMaybeEdgeKeys mapEdgeKeys insertNode insertEdge insertEdgeSetfromListfromMapmapNodemapNodeWithKeymapEdgemapEdgeWithKeynodeSetmapNodeWithInOut traverseNode traverseEdgetraverseisLoop pathExistsWrapunwrap$fTraversableWrap$fFoldableWrap $fFunctorWrap $fShowWrap $fOrdWrap$fEqWrapTotalMapdefltcoreconsintersectionPartialWith$fApplicativeTotalMap$fFunctorTotalMapCaller checkedLookupfromSet differenceSetintersectionSetcurryuncurryflip mapMaybeKeyscompose _lookupEdge_traverseNaiveInOutMap graphMapWrapedgeLabelsWrapreverseEdgeWrap_presucapplyMap fromMapWrap unwrapMapwrapMap unwrapSet unwrapInOutwithWrappedGraphfromWraptoWrap $fMonoidGraph$fReverseDirEdge$fArbitraryUndirEdge$fArbitraryDirEdge$fFoldableEitherEdge$fFoldableUndirEdge$fFoldableDirEdge$fFunctorDirEdge$fShow1EitherEdge$fOrd1EitherEdge$fEq1EitherEdge$fShow1UndirEdge$fOrd1UndirEdge$fEq1UndirEdge$fShow1DirEdge $fOrd1DirEdge $fEq1DirEdge$fEdgeEitherEdge$fEdgeUndirEdge $fEdgeDirEdge $fShowGraph