fgl 5.5.2.3 → 5.5.3.0
raw patch · 12 files changed
+262/−33 lines, 12 filesdep ~QuickCheckPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: QuickCheck
API changes (from Hackage documentation)
- Data.Graph.Inductive.Graph: instance (Graph gr, Ord a, Ord b) => Eq (OrdGr gr a b)
- Data.Graph.Inductive.Graph: instance (Graph gr, Ord a, Ord b) => Ord (OrdGr gr a b)
- Data.Graph.Inductive.Graph: instance Eq a => Eq (LPath a)
- Data.Graph.Inductive.Graph: instance Eq b => Eq (GroupEdges b)
- Data.Graph.Inductive.Graph: instance Ord a => Ord (LPath a)
- Data.Graph.Inductive.Graph: instance Read (gr a b) => Read (OrdGr gr a b)
- Data.Graph.Inductive.Graph: instance Read b => Read (GroupEdges b)
- Data.Graph.Inductive.Graph: instance Show (gr a b) => Show (OrdGr gr a b)
- Data.Graph.Inductive.Graph: instance Show a => Show (LPath a)
- Data.Graph.Inductive.Graph: instance Show b => Show (GroupEdges b)
- Data.Graph.Inductive.Graph: unLPath :: LPath a -> [LNode a]
- Data.Graph.Inductive.Graph: unOrdGr :: OrdGr gr a b -> gr a b
- Data.Graph.Inductive.Internal.Heap: instance (Eq a, Eq b) => Eq (Heap a b)
- Data.Graph.Inductive.Internal.Heap: instance (NFData a, NFData b) => NFData (Heap a b)
- Data.Graph.Inductive.Internal.Heap: instance (Read a, Read b) => Read (Heap a b)
- Data.Graph.Inductive.Internal.Heap: instance (Show a, Show b) => Show (Heap a b)
- Data.Graph.Inductive.Monad.IOArray: instance (Show a, Show b) => Show (IO (SGr a b))
- Data.Graph.Inductive.Monad.IOArray: instance (Show a, Show b) => Show (SGr a b)
- Data.Graph.Inductive.Monad.IOArray: instance GraphM IO SGr
- Data.Graph.Inductive.NodeMap: instance (Ord a, Read a) => Read (NodeMap a)
- Data.Graph.Inductive.NodeMap: instance Eq a => Eq (NodeMap a)
- Data.Graph.Inductive.NodeMap: instance NFData a => NFData (NodeMap a)
- Data.Graph.Inductive.NodeMap: instance Show a => Show (NodeMap a)
- Data.Graph.Inductive.PatriciaTree: instance (Eq a, Ord b) => Eq (Gr a b)
- Data.Graph.Inductive.PatriciaTree: instance (NFData a, NFData b) => NFData (Gr a b)
- Data.Graph.Inductive.PatriciaTree: instance (Read a, Read b) => Read (Gr a b)
- Data.Graph.Inductive.PatriciaTree: instance (Show a, Show b) => Show (Gr a b)
- Data.Graph.Inductive.PatriciaTree: instance Constructor C1_0Gr
- Data.Graph.Inductive.PatriciaTree: instance Datatype D1Gr
- Data.Graph.Inductive.PatriciaTree: instance DynGraph Gr
- Data.Graph.Inductive.PatriciaTree: instance Generic (Gr a b)
- Data.Graph.Inductive.PatriciaTree: instance Graph Gr
- Data.Graph.Inductive.Query.ArtPoint: instance Eq a => Eq (DFSTree a)
- Data.Graph.Inductive.Query.ArtPoint: instance Eq a => Eq (LOWTree a)
- Data.Graph.Inductive.Query.ArtPoint: instance Read a => Read (DFSTree a)
- Data.Graph.Inductive.Query.ArtPoint: instance Read a => Read (LOWTree a)
- Data.Graph.Inductive.Query.ArtPoint: instance Show a => Show (DFSTree a)
- Data.Graph.Inductive.Query.ArtPoint: instance Show a => Show (LOWTree a)
- Data.Graph.Inductive.Query.MaxFlow2: instance Eq Direction
- Data.Graph.Inductive.Query.MaxFlow2: instance Ord Direction
- Data.Graph.Inductive.Query.MaxFlow2: instance Read Direction
- Data.Graph.Inductive.Query.MaxFlow2: instance Show Direction
- Data.Graph.Inductive.Query.Monad: instance Monad m => Applicative (GT m g)
- Data.Graph.Inductive.Query.Monad: instance Monad m => Functor (GT m g)
- Data.Graph.Inductive.Query.Monad: instance Monad m => Monad (GT m g)
- Data.Graph.Inductive.Tree: instance (Eq a, Ord b) => Eq (Gr a b)
- Data.Graph.Inductive.Tree: instance (NFData a, NFData b) => NFData (Gr a b)
- Data.Graph.Inductive.Tree: instance (Read a, Read b) => Read (Gr a b)
- Data.Graph.Inductive.Tree: instance (Show a, Show b) => Show (Gr a b)
- Data.Graph.Inductive.Tree: instance Constructor C1_0Gr
- Data.Graph.Inductive.Tree: instance Datatype D1Gr
- Data.Graph.Inductive.Tree: instance DynGraph Gr
- Data.Graph.Inductive.Tree: instance Generic (Gr a b)
- Data.Graph.Inductive.Tree: instance Graph Gr
+ Data.Graph.Inductive.Graph: [unLPath] :: LPath a -> [LNode a]
+ Data.Graph.Inductive.Graph: [unOrdGr] :: OrdGr gr a b -> gr a b
+ Data.Graph.Inductive.Graph: instance (Data.Graph.Inductive.Graph.Graph gr, GHC.Classes.Ord a, GHC.Classes.Ord b) => GHC.Classes.Eq (Data.Graph.Inductive.Graph.OrdGr gr a b)
+ Data.Graph.Inductive.Graph: instance (Data.Graph.Inductive.Graph.Graph gr, GHC.Classes.Ord a, GHC.Classes.Ord b) => GHC.Classes.Ord (Data.Graph.Inductive.Graph.OrdGr gr a b)
+ Data.Graph.Inductive.Graph: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Graph.Inductive.Graph.LPath a)
+ Data.Graph.Inductive.Graph: instance GHC.Classes.Eq b => GHC.Classes.Eq (Data.Graph.Inductive.Graph.GroupEdges b)
+ Data.Graph.Inductive.Graph: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Graph.Inductive.Graph.LPath a)
+ Data.Graph.Inductive.Graph: instance GHC.Read.Read (gr a b) => GHC.Read.Read (Data.Graph.Inductive.Graph.OrdGr gr a b)
+ Data.Graph.Inductive.Graph: instance GHC.Read.Read b => GHC.Read.Read (Data.Graph.Inductive.Graph.GroupEdges b)
+ Data.Graph.Inductive.Graph: instance GHC.Show.Show (gr a b) => GHC.Show.Show (Data.Graph.Inductive.Graph.OrdGr gr a b)
+ Data.Graph.Inductive.Graph: instance GHC.Show.Show a => GHC.Show.Show (Data.Graph.Inductive.Graph.LPath a)
+ Data.Graph.Inductive.Graph: instance GHC.Show.Show b => GHC.Show.Show (Data.Graph.Inductive.Graph.GroupEdges b)
+ Data.Graph.Inductive.Graph: order :: (Graph gr) => gr a b -> Int
+ Data.Graph.Inductive.Graph: size :: (Graph gr) => gr a b -> Int
+ Data.Graph.Inductive.Internal.Heap: instance (Control.DeepSeq.NFData a, Control.DeepSeq.NFData b) => Control.DeepSeq.NFData (Data.Graph.Inductive.Internal.Heap.Heap a b)
+ Data.Graph.Inductive.Internal.Heap: instance (GHC.Classes.Eq b, GHC.Classes.Eq a) => GHC.Classes.Eq (Data.Graph.Inductive.Internal.Heap.Heap a b)
+ Data.Graph.Inductive.Internal.Heap: instance (GHC.Read.Read b, GHC.Read.Read a) => GHC.Read.Read (Data.Graph.Inductive.Internal.Heap.Heap a b)
+ Data.Graph.Inductive.Internal.Heap: instance (GHC.Show.Show b, GHC.Show.Show a) => GHC.Show.Show (Data.Graph.Inductive.Internal.Heap.Heap a b)
+ Data.Graph.Inductive.Monad.IOArray: instance (GHC.Show.Show a, GHC.Show.Show b) => GHC.Show.Show (Data.Graph.Inductive.Monad.IOArray.SGr a b)
+ Data.Graph.Inductive.Monad.IOArray: instance (GHC.Show.Show a, GHC.Show.Show b) => GHC.Show.Show (GHC.Types.IO (Data.Graph.Inductive.Monad.IOArray.SGr a b))
+ Data.Graph.Inductive.Monad.IOArray: instance Data.Graph.Inductive.Monad.GraphM GHC.Types.IO Data.Graph.Inductive.Monad.IOArray.SGr
+ Data.Graph.Inductive.Monad.STArray: SGr :: (GraphRep s a b) -> SGr s a b
+ Data.Graph.Inductive.Monad.STArray: defaultGraphSize :: Int
+ Data.Graph.Inductive.Monad.STArray: emptyN :: Int -> ST s (SGr s a b)
+ Data.Graph.Inductive.Monad.STArray: instance (GHC.Show.Show a, GHC.Show.Show b) => GHC.Show.Show (Data.Graph.Inductive.Monad.STArray.SGr GHC.Prim.RealWorld a b)
+ Data.Graph.Inductive.Monad.STArray: instance Data.Graph.Inductive.Monad.GraphM (GHC.ST.ST s) (Data.Graph.Inductive.Monad.STArray.SGr s)
+ Data.Graph.Inductive.Monad.STArray: newtype SGr s a b
+ Data.Graph.Inductive.Monad.STArray: removeDel :: STArray s Node Bool -> Adj b -> ST s (Adj b)
+ Data.Graph.Inductive.Monad.STArray: type Context' a b = Maybe (Adj b, a, Adj b)
+ Data.Graph.Inductive.Monad.STArray: type GraphRep s a b = (Int, Array Node (Context' a b), STArray s Node Bool)
+ Data.Graph.Inductive.Monad.STArray: type USGr s = SGr s () ()
+ Data.Graph.Inductive.NodeMap: instance (GHC.Read.Read a, GHC.Classes.Ord a) => GHC.Read.Read (Data.Graph.Inductive.NodeMap.NodeMap a)
+ Data.Graph.Inductive.NodeMap: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Data.Graph.Inductive.NodeMap.NodeMap a)
+ Data.Graph.Inductive.NodeMap: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Graph.Inductive.NodeMap.NodeMap a)
+ Data.Graph.Inductive.NodeMap: instance GHC.Show.Show a => GHC.Show.Show (Data.Graph.Inductive.NodeMap.NodeMap a)
+ Data.Graph.Inductive.PatriciaTree: instance (Control.DeepSeq.NFData a, Control.DeepSeq.NFData b) => Control.DeepSeq.NFData (Data.Graph.Inductive.PatriciaTree.Gr a b)
+ Data.Graph.Inductive.PatriciaTree: instance (GHC.Classes.Eq a, GHC.Classes.Ord b) => GHC.Classes.Eq (Data.Graph.Inductive.PatriciaTree.Gr a b)
+ Data.Graph.Inductive.PatriciaTree: instance (GHC.Read.Read a, GHC.Read.Read b) => GHC.Read.Read (Data.Graph.Inductive.PatriciaTree.Gr a b)
+ Data.Graph.Inductive.PatriciaTree: instance (GHC.Show.Show a, GHC.Show.Show b) => GHC.Show.Show (Data.Graph.Inductive.PatriciaTree.Gr a b)
+ Data.Graph.Inductive.PatriciaTree: instance Data.Bifunctor.Bifunctor Data.Graph.Inductive.PatriciaTree.Gr
+ Data.Graph.Inductive.PatriciaTree: instance Data.Graph.Inductive.Graph.DynGraph Data.Graph.Inductive.PatriciaTree.Gr
+ Data.Graph.Inductive.PatriciaTree: instance Data.Graph.Inductive.Graph.Graph Data.Graph.Inductive.PatriciaTree.Gr
+ Data.Graph.Inductive.PatriciaTree: instance GHC.Generics.Generic (Data.Graph.Inductive.PatriciaTree.Gr a b)
+ Data.Graph.Inductive.Query.ArtPoint: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Graph.Inductive.Query.ArtPoint.DFSTree a)
+ Data.Graph.Inductive.Query.ArtPoint: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Graph.Inductive.Query.ArtPoint.LOWTree a)
+ Data.Graph.Inductive.Query.ArtPoint: instance GHC.Read.Read a => GHC.Read.Read (Data.Graph.Inductive.Query.ArtPoint.DFSTree a)
+ Data.Graph.Inductive.Query.ArtPoint: instance GHC.Read.Read a => GHC.Read.Read (Data.Graph.Inductive.Query.ArtPoint.LOWTree a)
+ Data.Graph.Inductive.Query.ArtPoint: instance GHC.Show.Show a => GHC.Show.Show (Data.Graph.Inductive.Query.ArtPoint.DFSTree a)
+ Data.Graph.Inductive.Query.ArtPoint: instance GHC.Show.Show a => GHC.Show.Show (Data.Graph.Inductive.Query.ArtPoint.LOWTree a)
+ Data.Graph.Inductive.Query.MaxFlow2: instance GHC.Classes.Eq Data.Graph.Inductive.Query.MaxFlow2.Direction
+ Data.Graph.Inductive.Query.MaxFlow2: instance GHC.Classes.Ord Data.Graph.Inductive.Query.MaxFlow2.Direction
+ Data.Graph.Inductive.Query.MaxFlow2: instance GHC.Read.Read Data.Graph.Inductive.Query.MaxFlow2.Direction
+ Data.Graph.Inductive.Query.MaxFlow2: instance GHC.Show.Show Data.Graph.Inductive.Query.MaxFlow2.Direction
+ Data.Graph.Inductive.Query.Monad: infixr 8 ><
+ Data.Graph.Inductive.Query.Monad: instance GHC.Base.Monad m => GHC.Base.Applicative (Data.Graph.Inductive.Query.Monad.GT m g)
+ Data.Graph.Inductive.Query.Monad: instance GHC.Base.Monad m => GHC.Base.Functor (Data.Graph.Inductive.Query.Monad.GT m g)
+ Data.Graph.Inductive.Query.Monad: instance GHC.Base.Monad m => GHC.Base.Monad (Data.Graph.Inductive.Query.Monad.GT m g)
+ Data.Graph.Inductive.Query.TransClos: rc :: (DynGraph gr) => gr a b -> gr a ()
+ Data.Graph.Inductive.Query.TransClos: tc :: (DynGraph gr) => gr a b -> gr a ()
+ Data.Graph.Inductive.Tree: instance (Control.DeepSeq.NFData a, Control.DeepSeq.NFData b) => Control.DeepSeq.NFData (Data.Graph.Inductive.Tree.Gr a b)
+ Data.Graph.Inductive.Tree: instance (GHC.Classes.Eq a, GHC.Classes.Ord b) => GHC.Classes.Eq (Data.Graph.Inductive.Tree.Gr a b)
+ Data.Graph.Inductive.Tree: instance (GHC.Read.Read a, GHC.Read.Read b) => GHC.Read.Read (Data.Graph.Inductive.Tree.Gr a b)
+ Data.Graph.Inductive.Tree: instance (GHC.Show.Show a, GHC.Show.Show b) => GHC.Show.Show (Data.Graph.Inductive.Tree.Gr a b)
+ Data.Graph.Inductive.Tree: instance Data.Bifunctor.Bifunctor Data.Graph.Inductive.Tree.Gr
+ Data.Graph.Inductive.Tree: instance Data.Graph.Inductive.Graph.DynGraph Data.Graph.Inductive.Tree.Gr
+ Data.Graph.Inductive.Tree: instance Data.Graph.Inductive.Graph.Graph Data.Graph.Inductive.Tree.Gr
+ Data.Graph.Inductive.Tree: instance GHC.Generics.Generic (Data.Graph.Inductive.Tree.Gr a b)
- Data.Graph.Inductive.Basic: efilter :: DynGraph gr => (LEdge b -> Bool) -> gr a b -> gr a b
+ Data.Graph.Inductive.Basic: efilter :: (DynGraph gr) => (LEdge b -> Bool) -> gr a b -> gr a b
- Data.Graph.Inductive.Basic: elfilter :: DynGraph gr => (b -> Bool) -> gr a b -> gr a b
+ Data.Graph.Inductive.Basic: elfilter :: (DynGraph gr) => (b -> Bool) -> gr a b -> gr a b
- Data.Graph.Inductive.Basic: gfold :: Graph gr => (Context a b -> [Node]) -> (Context a b -> c -> d) -> (Maybe d -> c -> c, c) -> [Node] -> gr a b -> c
+ Data.Graph.Inductive.Basic: gfold :: (Graph gr) => (Context a b -> [Node]) -> (Context a b -> c -> d) -> (Maybe d -> c -> c, c) -> [Node] -> gr a b -> c
- Data.Graph.Inductive.Basic: grev :: DynGraph gr => gr a b -> gr a b
+ Data.Graph.Inductive.Basic: grev :: (DynGraph gr) => gr a b -> gr a b
- Data.Graph.Inductive.Basic: gsel :: Graph gr => (Context a b -> Bool) -> gr a b -> [Context a b]
+ Data.Graph.Inductive.Basic: gsel :: (Graph gr) => (Context a b -> Bool) -> gr a b -> [Context a b]
- Data.Graph.Inductive.Basic: hasLoop :: Graph gr => gr a b -> Bool
+ Data.Graph.Inductive.Basic: hasLoop :: (Graph gr) => gr a b -> Bool
- Data.Graph.Inductive.Basic: isSimple :: Graph gr => gr a b -> Bool
+ Data.Graph.Inductive.Basic: isSimple :: (Graph gr) => gr a b -> Bool
- Data.Graph.Inductive.Basic: unlab :: DynGraph gr => gr a b -> gr () ()
+ Data.Graph.Inductive.Basic: unlab :: (DynGraph gr) => gr a b -> gr () ()
- Data.Graph.Inductive.Example: genLNodes :: Enum a => a -> Int -> [LNode a]
+ Data.Graph.Inductive.Example: genLNodes :: (Enum a) => a -> Int -> [LNode a]
- Data.Graph.Inductive.Example: star :: Graph gr => Int -> gr () ()
+ Data.Graph.Inductive.Example: star :: (Graph gr) => Int -> gr () ()
- Data.Graph.Inductive.Example: starM :: GraphM m gr => Int -> m (gr () ())
+ Data.Graph.Inductive.Example: starM :: (GraphM m gr) => Int -> m (gr () ())
- Data.Graph.Inductive.Example: ucycle :: Graph gr => Int -> gr () ()
+ Data.Graph.Inductive.Example: ucycle :: (Graph gr) => Int -> gr () ()
- Data.Graph.Inductive.Example: ucycleM :: GraphM m gr => Int -> m (gr () ())
+ Data.Graph.Inductive.Example: ucycleM :: (GraphM m gr) => Int -> m (gr () ())
- Data.Graph.Inductive.Graph: buildGr :: DynGraph gr => [Context a b] -> gr a b
+ Data.Graph.Inductive.Graph: buildGr :: (DynGraph gr) => [Context a b] -> gr a b
- Data.Graph.Inductive.Graph: class Graph gr => DynGraph gr
+ Data.Graph.Inductive.Graph: class (Graph gr) => DynGraph gr
- Data.Graph.Inductive.Graph: context :: Graph gr => gr a b -> Node -> Context a b
+ Data.Graph.Inductive.Graph: context :: (Graph gr) => gr a b -> Node -> Context a b
- Data.Graph.Inductive.Graph: deg :: Graph gr => gr a b -> Node -> Int
+ Data.Graph.Inductive.Graph: deg :: (Graph gr) => gr a b -> Node -> Int
- Data.Graph.Inductive.Graph: delEdge :: DynGraph gr => Edge -> gr a b -> gr a b
+ Data.Graph.Inductive.Graph: delEdge :: (DynGraph gr) => Edge -> gr a b -> gr a b
- Data.Graph.Inductive.Graph: delEdges :: DynGraph gr => [Edge] -> gr a b -> gr a b
+ Data.Graph.Inductive.Graph: delEdges :: (DynGraph gr) => [Edge] -> gr a b -> gr a b
- Data.Graph.Inductive.Graph: delNode :: Graph gr => Node -> gr a b -> gr a b
+ Data.Graph.Inductive.Graph: delNode :: (Graph gr) => Node -> gr a b -> gr a b
- Data.Graph.Inductive.Graph: delNodes :: Graph gr => [Node] -> gr a b -> gr a b
+ Data.Graph.Inductive.Graph: delNodes :: (Graph gr) => [Node] -> gr a b -> gr a b
- Data.Graph.Inductive.Graph: edges :: Graph gr => gr a b -> [Edge]
+ Data.Graph.Inductive.Graph: edges :: (Graph gr) => gr a b -> [Edge]
- Data.Graph.Inductive.Graph: emap :: DynGraph gr => (b -> c) -> gr a b -> gr a c
+ Data.Graph.Inductive.Graph: emap :: (DynGraph gr) => (b -> c) -> gr a b -> gr a c
- Data.Graph.Inductive.Graph: gelem :: Graph gr => Node -> gr a b -> Bool
+ Data.Graph.Inductive.Graph: gelem :: (Graph gr) => Node -> gr a b -> Bool
- Data.Graph.Inductive.Graph: gmap :: DynGraph gr => (Context a b -> Context c d) -> gr a b -> gr c d
+ Data.Graph.Inductive.Graph: gmap :: (DynGraph gr) => (Context a b -> Context c d) -> gr a b -> gr c d
- Data.Graph.Inductive.Graph: indeg :: Graph gr => gr a b -> Node -> Int
+ Data.Graph.Inductive.Graph: indeg :: (Graph gr) => gr a b -> Node -> Int
- Data.Graph.Inductive.Graph: inn :: Graph gr => gr a b -> Node -> [LEdge b]
+ Data.Graph.Inductive.Graph: inn :: (Graph gr) => gr a b -> Node -> [LEdge b]
- Data.Graph.Inductive.Graph: insEdge :: DynGraph gr => LEdge b -> gr a b -> gr a b
+ Data.Graph.Inductive.Graph: insEdge :: (DynGraph gr) => LEdge b -> gr a b -> gr a b
- Data.Graph.Inductive.Graph: insEdges :: DynGraph gr => [LEdge b] -> gr a b -> gr a b
+ Data.Graph.Inductive.Graph: insEdges :: (DynGraph gr) => [LEdge b] -> gr a b -> gr a b
- Data.Graph.Inductive.Graph: insNode :: DynGraph gr => LNode a -> gr a b -> gr a b
+ Data.Graph.Inductive.Graph: insNode :: (DynGraph gr) => LNode a -> gr a b -> gr a b
- Data.Graph.Inductive.Graph: insNodes :: DynGraph gr => [LNode a] -> gr a b -> gr a b
+ Data.Graph.Inductive.Graph: insNodes :: (DynGraph gr) => [LNode a] -> gr a b -> gr a b
- Data.Graph.Inductive.Graph: lab :: Graph gr => gr a b -> Node -> Maybe a
+ Data.Graph.Inductive.Graph: lab :: (Graph gr) => gr a b -> Node -> Maybe a
- Data.Graph.Inductive.Graph: lneighbors :: Graph gr => gr a b -> Node -> Adj b
+ Data.Graph.Inductive.Graph: lneighbors :: (Graph gr) => gr a b -> Node -> Adj b
- Data.Graph.Inductive.Graph: lpre :: Graph gr => gr a b -> Node -> [(Node, b)]
+ Data.Graph.Inductive.Graph: lpre :: (Graph gr) => gr a b -> Node -> [(Node, b)]
- Data.Graph.Inductive.Graph: lsuc :: Graph gr => gr a b -> Node -> [(Node, b)]
+ Data.Graph.Inductive.Graph: lsuc :: (Graph gr) => gr a b -> Node -> [(Node, b)]
- Data.Graph.Inductive.Graph: mkUGraph :: Graph gr => [Node] -> [Edge] -> gr () ()
+ Data.Graph.Inductive.Graph: mkUGraph :: (Graph gr) => [Node] -> [Edge] -> gr () ()
- Data.Graph.Inductive.Graph: neighbors :: Graph gr => gr a b -> Node -> [Node]
+ Data.Graph.Inductive.Graph: neighbors :: (Graph gr) => gr a b -> Node -> [Node]
- Data.Graph.Inductive.Graph: nemap :: DynGraph gr => (a -> c) -> (b -> d) -> gr a b -> gr c d
+ Data.Graph.Inductive.Graph: nemap :: (DynGraph gr) => (a -> c) -> (b -> d) -> gr a b -> gr c d
- Data.Graph.Inductive.Graph: newNodes :: Graph gr => Int -> gr a b -> [Node]
+ Data.Graph.Inductive.Graph: newNodes :: (Graph gr) => Int -> gr a b -> [Node]
- Data.Graph.Inductive.Graph: nmap :: DynGraph gr => (a -> c) -> gr a b -> gr c b
+ Data.Graph.Inductive.Graph: nmap :: (DynGraph gr) => (a -> c) -> gr a b -> gr c b
- Data.Graph.Inductive.Graph: nodes :: Graph gr => gr a b -> [Node]
+ Data.Graph.Inductive.Graph: nodes :: (Graph gr) => gr a b -> [Node]
- Data.Graph.Inductive.Graph: out :: Graph gr => gr a b -> Node -> [LEdge b]
+ Data.Graph.Inductive.Graph: out :: (Graph gr) => gr a b -> Node -> [LEdge b]
- Data.Graph.Inductive.Graph: outdeg :: Graph gr => gr a b -> Node -> Int
+ Data.Graph.Inductive.Graph: outdeg :: (Graph gr) => gr a b -> Node -> Int
- Data.Graph.Inductive.Graph: pre :: Graph gr => gr a b -> Node -> [Node]
+ Data.Graph.Inductive.Graph: pre :: (Graph gr) => gr a b -> Node -> [Node]
- Data.Graph.Inductive.Graph: suc :: Graph gr => gr a b -> Node -> [Node]
+ Data.Graph.Inductive.Graph: suc :: (Graph gr) => gr a b -> Node -> [Node]
- Data.Graph.Inductive.Graph: ufold :: Graph gr => (Context a b -> c -> c) -> c -> gr a b -> c
+ Data.Graph.Inductive.Graph: ufold :: (Graph gr) => (Context a b -> c -> c) -> c -> gr a b -> c
- Data.Graph.Inductive.Internal.Heap: build :: Ord a => [(a, b)] -> Heap a b
+ Data.Graph.Inductive.Internal.Heap: build :: (Ord a) => [(a, b)] -> Heap a b
- Data.Graph.Inductive.Internal.Heap: deleteMin :: Ord a => Heap a b -> Heap a b
+ Data.Graph.Inductive.Internal.Heap: deleteMin :: (Ord a) => Heap a b -> Heap a b
- Data.Graph.Inductive.Internal.Heap: heapsort :: Ord a => [a] -> [a]
+ Data.Graph.Inductive.Internal.Heap: heapsort :: (Ord a) => [a] -> [a]
- Data.Graph.Inductive.Internal.Heap: insert :: Ord a => (a, b) -> Heap a b -> Heap a b
+ Data.Graph.Inductive.Internal.Heap: insert :: (Ord a) => (a, b) -> Heap a b -> Heap a b
- Data.Graph.Inductive.Internal.Heap: merge :: Ord a => Heap a b -> Heap a b -> Heap a b
+ Data.Graph.Inductive.Internal.Heap: merge :: (Ord a) => Heap a b -> Heap a b -> Heap a b
- Data.Graph.Inductive.Internal.Heap: mergeAll :: Ord a => [Heap a b] -> Heap a b
+ Data.Graph.Inductive.Internal.Heap: mergeAll :: (Ord a) => [Heap a b] -> Heap a b
- Data.Graph.Inductive.Internal.Heap: splitMin :: Ord a => Heap a b -> (a, b, Heap a b)
+ Data.Graph.Inductive.Internal.Heap: splitMin :: (Ord a) => Heap a b -> (a, b, Heap a b)
- Data.Graph.Inductive.Internal.Heap: toList :: Ord a => Heap a b -> [(a, b)]
+ Data.Graph.Inductive.Internal.Heap: toList :: (Ord a) => Heap a b -> [(a, b)]
- Data.Graph.Inductive.Monad: class Monad m => GraphM m gr where matchAnyM g = do { vs <- labNodesM g; case vs of { [] -> fail "Match Exception, Empty Graph" (v, _) : _ -> do { (Just c, g') <- matchM v g; return (c, g') } } } noNodesM = labNodesM >>. length nodeRangeM g = do { isE <- isEmptyM g; if isE then fail "nodeRangeM of empty graph" else do { vs <- nodesM g; return (minimum vs, maximum vs) } } labEdgesM = ufoldM (\ (p, v, _, s) -> ((map (i v) p ++ map (o v) s) ++)) [] where o v = \ (l, w) -> (v, w, l) i v = \ (l, w) -> (w, v, l)
+ Data.Graph.Inductive.Monad: class (Monad m) => GraphM m gr where matchAnyM g = do { vs <- labNodesM g; case vs of { [] -> fail "Match Exception, Empty Graph" (v, _) : _ -> do { (Just c, g') <- matchM v g; return (c, g') } } } noNodesM = labNodesM >>. length nodeRangeM g = do { isE <- isEmptyM g; if isE then fail "nodeRangeM of empty graph" else do { vs <- nodesM g; return (minimum vs, maximum vs) } } labEdgesM = ufoldM (\ (p, v, _, s) -> ((map (i v) p ++ map (o v) s) ++)) [] where o v = \ (l, w) -> (v, w, l) i v = \ (l, w) -> (w, v, l)
- Data.Graph.Inductive.Monad: contextM :: GraphM m gr => m (gr a b) -> Node -> m (Context a b)
+ Data.Graph.Inductive.Monad: contextM :: (GraphM m gr) => m (gr a b) -> Node -> m (Context a b)
- Data.Graph.Inductive.Monad: delNodeM :: GraphM m gr => Node -> m (gr a b) -> m (gr a b)
+ Data.Graph.Inductive.Monad: delNodeM :: (GraphM m gr) => Node -> m (gr a b) -> m (gr a b)
- Data.Graph.Inductive.Monad: delNodesM :: GraphM m gr => [Node] -> m (gr a b) -> m (gr a b)
+ Data.Graph.Inductive.Monad: delNodesM :: (GraphM m gr) => [Node] -> m (gr a b) -> m (gr a b)
- Data.Graph.Inductive.Monad: edgesM :: GraphM m gr => m (gr a b) -> m [Edge]
+ Data.Graph.Inductive.Monad: edgesM :: (GraphM m gr) => m (gr a b) -> m [Edge]
- Data.Graph.Inductive.Monad: labM :: GraphM m gr => m (gr a b) -> Node -> m (Maybe a)
+ Data.Graph.Inductive.Monad: labM :: (GraphM m gr) => m (gr a b) -> Node -> m (Maybe a)
- Data.Graph.Inductive.Monad: mkUGraphM :: GraphM m gr => [Node] -> [Edge] -> m (gr () ())
+ Data.Graph.Inductive.Monad: mkUGraphM :: (GraphM m gr) => [Node] -> [Edge] -> m (gr () ())
- Data.Graph.Inductive.Monad: newNodesM :: GraphM m gr => Int -> m (gr a b) -> m [Node]
+ Data.Graph.Inductive.Monad: newNodesM :: (GraphM m gr) => Int -> m (gr a b) -> m [Node]
- Data.Graph.Inductive.Monad: nodesM :: GraphM m gr => m (gr a b) -> m [Node]
+ Data.Graph.Inductive.Monad: nodesM :: (GraphM m gr) => m (gr a b) -> m [Node]
- Data.Graph.Inductive.Monad: ufoldM :: GraphM m gr => (Context a b -> c -> c) -> c -> m (gr a b) -> m c
+ Data.Graph.Inductive.Monad: ufoldM :: (GraphM m gr) => (Context a b -> c -> c) -> c -> m (gr a b) -> m c
- Data.Graph.Inductive.NodeMap: mkEdge :: Ord a => NodeMap a -> (a, a, b) -> Maybe (LEdge b)
+ Data.Graph.Inductive.NodeMap: mkEdge :: (Ord a) => NodeMap a -> (a, a, b) -> Maybe (LEdge b)
- Data.Graph.Inductive.NodeMap: mkEdgeM :: (Ord a, DynGraph g) => (a, a, b) -> NodeMapM a b g (Maybe (LEdge b))
+ Data.Graph.Inductive.NodeMap: mkEdgeM :: (Ord a) => (a, a, b) -> NodeMapM a b g (Maybe (LEdge b))
- Data.Graph.Inductive.NodeMap: mkEdges :: Ord a => NodeMap a -> [(a, a, b)] -> Maybe [LEdge b]
+ Data.Graph.Inductive.NodeMap: mkEdges :: (Ord a) => NodeMap a -> [(a, a, b)] -> Maybe [LEdge b]
- Data.Graph.Inductive.NodeMap: mkEdgesM :: (Ord a, DynGraph g) => [(a, a, b)] -> NodeMapM a b g (Maybe [LEdge b])
+ Data.Graph.Inductive.NodeMap: mkEdgesM :: (Ord a) => [(a, a, b)] -> NodeMapM a b g (Maybe [LEdge b])
- Data.Graph.Inductive.NodeMap: mkNode :: Ord a => NodeMap a -> a -> (LNode a, NodeMap a)
+ Data.Graph.Inductive.NodeMap: mkNode :: (Ord a) => NodeMap a -> a -> (LNode a, NodeMap a)
- Data.Graph.Inductive.NodeMap: mkNodeM :: (Ord a, DynGraph g) => a -> NodeMapM a b g (LNode a)
+ Data.Graph.Inductive.NodeMap: mkNodeM :: (Ord a) => a -> NodeMapM a b g (LNode a)
- Data.Graph.Inductive.NodeMap: mkNode_ :: Ord a => NodeMap a -> a -> LNode a
+ Data.Graph.Inductive.NodeMap: mkNode_ :: (Ord a) => NodeMap a -> a -> LNode a
- Data.Graph.Inductive.NodeMap: mkNodes :: Ord a => NodeMap a -> [a] -> ([LNode a], NodeMap a)
+ Data.Graph.Inductive.NodeMap: mkNodes :: (Ord a) => NodeMap a -> [a] -> ([LNode a], NodeMap a)
- Data.Graph.Inductive.NodeMap: mkNodesM :: (Ord a, DynGraph g) => [a] -> NodeMapM a b g [LNode a]
+ Data.Graph.Inductive.NodeMap: mkNodesM :: (Ord a) => [a] -> NodeMapM a b g [LNode a]
- Data.Graph.Inductive.NodeMap: mkNodes_ :: Ord a => NodeMap a -> [a] -> [LNode a]
+ Data.Graph.Inductive.NodeMap: mkNodes_ :: (Ord a) => NodeMap a -> [a] -> [LNode a]
- Data.Graph.Inductive.Query.ArtPoint: ap :: Graph gr => gr a b -> [Node]
+ Data.Graph.Inductive.Query.ArtPoint: ap :: (Graph gr) => gr a b -> [Node]
- Data.Graph.Inductive.Query.BCC: bcc :: DynGraph gr => gr a b -> [gr a b]
+ Data.Graph.Inductive.Query.BCC: bcc :: (DynGraph gr) => gr a b -> [gr a b]
- Data.Graph.Inductive.Query.BFS: bfe :: Graph gr => Node -> gr a b -> [Edge]
+ Data.Graph.Inductive.Query.BFS: bfe :: (Graph gr) => Node -> gr a b -> [Edge]
- Data.Graph.Inductive.Query.BFS: bfen :: Graph gr => [Edge] -> gr a b -> [Edge]
+ Data.Graph.Inductive.Query.BFS: bfen :: (Graph gr) => [Edge] -> gr a b -> [Edge]
- Data.Graph.Inductive.Query.BFS: bfs :: Graph gr => Node -> gr a b -> [Node]
+ Data.Graph.Inductive.Query.BFS: bfs :: (Graph gr) => Node -> gr a b -> [Node]
- Data.Graph.Inductive.Query.BFS: bfsWith :: Graph gr => (Context a b -> c) -> Node -> gr a b -> [c]
+ Data.Graph.Inductive.Query.BFS: bfsWith :: (Graph gr) => (Context a b -> c) -> Node -> gr a b -> [c]
- Data.Graph.Inductive.Query.BFS: bfsn :: Graph gr => [Node] -> gr a b -> [Node]
+ Data.Graph.Inductive.Query.BFS: bfsn :: (Graph gr) => [Node] -> gr a b -> [Node]
- Data.Graph.Inductive.Query.BFS: bfsnWith :: Graph gr => (Context a b -> c) -> [Node] -> gr a b -> [c]
+ Data.Graph.Inductive.Query.BFS: bfsnWith :: (Graph gr) => (Context a b -> c) -> [Node] -> gr a b -> [c]
- Data.Graph.Inductive.Query.BFS: bft :: Graph gr => Node -> gr a b -> RTree
+ Data.Graph.Inductive.Query.BFS: bft :: (Graph gr) => Node -> gr a b -> RTree
- Data.Graph.Inductive.Query.BFS: esp :: Graph gr => Node -> Node -> gr a b -> Path
+ Data.Graph.Inductive.Query.BFS: esp :: (Graph gr) => Node -> Node -> gr a b -> Path
- Data.Graph.Inductive.Query.BFS: lbft :: Graph gr => Node -> gr a b -> LRTree b
+ Data.Graph.Inductive.Query.BFS: lbft :: (Graph gr) => Node -> gr a b -> LRTree b
- Data.Graph.Inductive.Query.BFS: lesp :: Graph gr => Node -> Node -> gr a b -> LPath b
+ Data.Graph.Inductive.Query.BFS: lesp :: (Graph gr) => Node -> Node -> gr a b -> LPath b
- Data.Graph.Inductive.Query.BFS: level :: Graph gr => Node -> gr a b -> [(Node, Int)]
+ Data.Graph.Inductive.Query.BFS: level :: (Graph gr) => Node -> gr a b -> [(Node, Int)]
- Data.Graph.Inductive.Query.BFS: leveln :: Graph gr => [(Node, Int)] -> gr a b -> [(Node, Int)]
+ Data.Graph.Inductive.Query.BFS: leveln :: (Graph gr) => [(Node, Int)] -> gr a b -> [(Node, Int)]
- Data.Graph.Inductive.Query.DFS: components :: Graph gr => gr a b -> [[Node]]
+ Data.Graph.Inductive.Query.DFS: components :: (Graph gr) => gr a b -> [[Node]]
- Data.Graph.Inductive.Query.DFS: dff :: Graph gr => [Node] -> gr a b -> [Tree Node]
+ Data.Graph.Inductive.Query.DFS: dff :: (Graph gr) => [Node] -> gr a b -> [Tree Node]
- Data.Graph.Inductive.Query.DFS: dff' :: Graph gr => gr a b -> [Tree Node]
+ Data.Graph.Inductive.Query.DFS: dff' :: (Graph gr) => gr a b -> [Tree Node]
- Data.Graph.Inductive.Query.DFS: dffWith :: Graph gr => CFun a b c -> [Node] -> gr a b -> [Tree c]
+ Data.Graph.Inductive.Query.DFS: dffWith :: (Graph gr) => CFun a b c -> [Node] -> gr a b -> [Tree c]
- Data.Graph.Inductive.Query.DFS: dffWith' :: Graph gr => CFun a b c -> gr a b -> [Tree c]
+ Data.Graph.Inductive.Query.DFS: dffWith' :: (Graph gr) => CFun a b c -> gr a b -> [Tree c]
- Data.Graph.Inductive.Query.DFS: dfs :: Graph gr => [Node] -> gr a b -> [Node]
+ Data.Graph.Inductive.Query.DFS: dfs :: (Graph gr) => [Node] -> gr a b -> [Node]
- Data.Graph.Inductive.Query.DFS: dfs' :: Graph gr => gr a b -> [Node]
+ Data.Graph.Inductive.Query.DFS: dfs' :: (Graph gr) => gr a b -> [Node]
- Data.Graph.Inductive.Query.DFS: dfsWith :: Graph gr => CFun a b c -> [Node] -> gr a b -> [c]
+ Data.Graph.Inductive.Query.DFS: dfsWith :: (Graph gr) => CFun a b c -> [Node] -> gr a b -> [c]
- Data.Graph.Inductive.Query.DFS: dfsWith' :: Graph gr => CFun a b c -> gr a b -> [c]
+ Data.Graph.Inductive.Query.DFS: dfsWith' :: (Graph gr) => CFun a b c -> gr a b -> [c]
- Data.Graph.Inductive.Query.DFS: isConnected :: Graph gr => gr a b -> Bool
+ Data.Graph.Inductive.Query.DFS: isConnected :: (Graph gr) => gr a b -> Bool
- Data.Graph.Inductive.Query.DFS: noComponents :: Graph gr => gr a b -> Int
+ Data.Graph.Inductive.Query.DFS: noComponents :: (Graph gr) => gr a b -> Int
- Data.Graph.Inductive.Query.DFS: rdff :: Graph gr => [Node] -> gr a b -> [Tree Node]
+ Data.Graph.Inductive.Query.DFS: rdff :: (Graph gr) => [Node] -> gr a b -> [Tree Node]
- Data.Graph.Inductive.Query.DFS: rdff' :: Graph gr => gr a b -> [Tree Node]
+ Data.Graph.Inductive.Query.DFS: rdff' :: (Graph gr) => gr a b -> [Tree Node]
- Data.Graph.Inductive.Query.DFS: rdffWith :: Graph gr => CFun a b c -> [Node] -> gr a b -> [Tree c]
+ Data.Graph.Inductive.Query.DFS: rdffWith :: (Graph gr) => CFun a b c -> [Node] -> gr a b -> [Tree c]
- Data.Graph.Inductive.Query.DFS: rdffWith' :: Graph gr => CFun a b c -> gr a b -> [Tree c]
+ Data.Graph.Inductive.Query.DFS: rdffWith' :: (Graph gr) => CFun a b c -> gr a b -> [Tree c]
- Data.Graph.Inductive.Query.DFS: rdfs :: Graph gr => [Node] -> gr a b -> [Node]
+ Data.Graph.Inductive.Query.DFS: rdfs :: (Graph gr) => [Node] -> gr a b -> [Node]
- Data.Graph.Inductive.Query.DFS: rdfs' :: Graph gr => gr a b -> [Node]
+ Data.Graph.Inductive.Query.DFS: rdfs' :: (Graph gr) => gr a b -> [Node]
- Data.Graph.Inductive.Query.DFS: reachable :: Graph gr => Node -> gr a b -> [Node]
+ Data.Graph.Inductive.Query.DFS: reachable :: (Graph gr) => Node -> gr a b -> [Node]
- Data.Graph.Inductive.Query.DFS: scc :: Graph gr => gr a b -> [[Node]]
+ Data.Graph.Inductive.Query.DFS: scc :: (Graph gr) => gr a b -> [[Node]]
- Data.Graph.Inductive.Query.DFS: topsort :: Graph gr => gr a b -> [Node]
+ Data.Graph.Inductive.Query.DFS: topsort :: (Graph gr) => gr a b -> [Node]
- Data.Graph.Inductive.Query.DFS: topsort' :: Graph gr => gr a b -> [a]
+ Data.Graph.Inductive.Query.DFS: topsort' :: (Graph gr) => gr a b -> [a]
- Data.Graph.Inductive.Query.DFS: udff :: Graph gr => [Node] -> gr a b -> [Tree Node]
+ Data.Graph.Inductive.Query.DFS: udff :: (Graph gr) => [Node] -> gr a b -> [Tree Node]
- Data.Graph.Inductive.Query.DFS: udff' :: Graph gr => gr a b -> [Tree Node]
+ Data.Graph.Inductive.Query.DFS: udff' :: (Graph gr) => gr a b -> [Tree Node]
- Data.Graph.Inductive.Query.DFS: udffWith :: Graph gr => CFun a b c -> [Node] -> gr a b -> [Tree c]
+ Data.Graph.Inductive.Query.DFS: udffWith :: (Graph gr) => CFun a b c -> [Node] -> gr a b -> [Tree c]
- Data.Graph.Inductive.Query.DFS: udffWith' :: Graph gr => CFun a b c -> gr a b -> [Tree c]
+ Data.Graph.Inductive.Query.DFS: udffWith' :: (Graph gr) => CFun a b c -> gr a b -> [Tree c]
- Data.Graph.Inductive.Query.DFS: udfs :: Graph gr => [Node] -> gr a b -> [Node]
+ Data.Graph.Inductive.Query.DFS: udfs :: (Graph gr) => [Node] -> gr a b -> [Node]
- Data.Graph.Inductive.Query.DFS: udfs' :: Graph gr => gr a b -> [Node]
+ Data.Graph.Inductive.Query.DFS: udfs' :: (Graph gr) => gr a b -> [Node]
- Data.Graph.Inductive.Query.DFS: xdfWith :: Graph gr => CFun a b [Node] -> CFun a b c -> [Node] -> gr a b -> ([Tree c], gr a b)
+ Data.Graph.Inductive.Query.DFS: xdfWith :: (Graph gr) => CFun a b [Node] -> CFun a b c -> [Node] -> gr a b -> ([Tree c], gr a b)
- Data.Graph.Inductive.Query.DFS: xdffWith :: Graph gr => CFun a b [Node] -> CFun a b c -> [Node] -> gr a b -> [Tree c]
+ Data.Graph.Inductive.Query.DFS: xdffWith :: (Graph gr) => CFun a b [Node] -> CFun a b c -> [Node] -> gr a b -> [Tree c]
- Data.Graph.Inductive.Query.DFS: xdfsWith :: Graph gr => CFun a b [Node] -> CFun a b c -> [Node] -> gr a b -> [c]
+ Data.Graph.Inductive.Query.DFS: xdfsWith :: (Graph gr) => CFun a b [Node] -> CFun a b c -> [Node] -> gr a b -> [c]
- Data.Graph.Inductive.Query.Dominators: dom :: Graph gr => gr a b -> Node -> [(Node, [Node])]
+ Data.Graph.Inductive.Query.Dominators: dom :: (Graph gr) => gr a b -> Node -> [(Node, [Node])]
- Data.Graph.Inductive.Query.Dominators: iDom :: Graph gr => gr a b -> Node -> [(Node, Node)]
+ Data.Graph.Inductive.Query.Dominators: iDom :: (Graph gr) => gr a b -> Node -> [(Node, Node)]
- Data.Graph.Inductive.Query.GVD: nearestNode :: Real b => Node -> Voronoi b -> Maybe Node
+ Data.Graph.Inductive.Query.GVD: nearestNode :: Node -> Voronoi b -> Maybe Node
- Data.Graph.Inductive.Query.Indep: indep :: DynGraph gr => gr a b -> [Node]
+ Data.Graph.Inductive.Query.Indep: indep :: (DynGraph gr) => gr a b -> [Node]
- Data.Graph.Inductive.Query.Indep: indepSize :: DynGraph gr => gr a b -> ([Node], Int)
+ Data.Graph.Inductive.Query.Indep: indepSize :: (DynGraph gr) => gr a b -> ([Node], Int)
- Data.Graph.Inductive.Query.MaxFlow: getRevEdges :: Num b => [Edge] -> [LEdge b]
+ Data.Graph.Inductive.Query.MaxFlow: getRevEdges :: (Num b) => [Edge] -> [LEdge b]
- Data.Graph.Inductive.Query.MaxFlow: updAdjList :: Num b => Adj (b, b, b) -> Node -> b -> Bool -> Adj (b, b, b)
+ Data.Graph.Inductive.Query.MaxFlow: updAdjList :: (Num b) => Adj (b, b, b) -> Node -> b -> Bool -> Adj (b, b, b)
- Data.Graph.Inductive.Query.Monad: apply' :: Monad m => GT m g a -> g -> m (a, g)
+ Data.Graph.Inductive.Query.Monad: apply' :: (Monad m) => GT m g a -> g -> m (a, g)
- Data.Graph.Inductive.Query.Monad: applyWith :: Monad m => (a -> b) -> GT m g a -> m g -> m (b, g)
+ Data.Graph.Inductive.Query.Monad: applyWith :: (Monad m) => (a -> b) -> GT m g a -> m g -> m (b, g)
- Data.Graph.Inductive.Query.Monad: applyWith' :: Monad m => (a -> b) -> GT m g a -> g -> m (b, g)
+ Data.Graph.Inductive.Query.Monad: applyWith' :: (Monad m) => (a -> b) -> GT m g a -> g -> m (b, g)
- Data.Graph.Inductive.Query.Monad: condMGT :: Monad m => (m s -> m Bool) -> GT m s a -> GT m s a -> GT m s a
+ Data.Graph.Inductive.Query.Monad: condMGT :: (Monad m) => (m s -> m Bool) -> GT m s a -> GT m s a -> GT m s a
- Data.Graph.Inductive.Query.Monad: condMGT' :: Monad m => (s -> Bool) -> GT m s a -> GT m s a -> GT m s a
+ Data.Graph.Inductive.Query.Monad: condMGT' :: (Monad m) => (s -> Bool) -> GT m s a -> GT m s a -> GT m s a
- Data.Graph.Inductive.Query.Monad: dffM :: GraphM m gr => [Node] -> GT m (gr a b) [Tree Node]
+ Data.Graph.Inductive.Query.Monad: dffM :: (GraphM m gr) => [Node] -> GT m (gr a b) [Tree Node]
- Data.Graph.Inductive.Query.Monad: dfsGT :: GraphM m gr => [Node] -> GT m (gr a b) [Node]
+ Data.Graph.Inductive.Query.Monad: dfsGT :: (GraphM m gr) => [Node] -> GT m (gr a b) [Node]
- Data.Graph.Inductive.Query.Monad: dfsM :: GraphM m gr => [Node] -> m (gr a b) -> m [Node]
+ Data.Graph.Inductive.Query.Monad: dfsM :: (GraphM m gr) => [Node] -> m (gr a b) -> m [Node]
- Data.Graph.Inductive.Query.Monad: dfsM' :: GraphM m gr => m (gr a b) -> m [Node]
+ Data.Graph.Inductive.Query.Monad: dfsM' :: (GraphM m gr) => m (gr a b) -> m [Node]
- Data.Graph.Inductive.Query.Monad: getContext :: GraphM m gr => GT m (gr a b) (Context a b)
+ Data.Graph.Inductive.Query.Monad: getContext :: (GraphM m gr) => GT m (gr a b) (Context a b)
- Data.Graph.Inductive.Query.Monad: getNode :: GraphM m gr => GT m (gr a b) Node
+ Data.Graph.Inductive.Query.Monad: getNode :: (GraphM m gr) => GT m (gr a b) Node
- Data.Graph.Inductive.Query.Monad: getNodes :: GraphM m gr => GT m (gr a b) [Node]
+ Data.Graph.Inductive.Query.Monad: getNodes :: (GraphM m gr) => GT m (gr a b) [Node]
- Data.Graph.Inductive.Query.Monad: graphDff :: GraphM m gr => [Node] -> m (gr a b) -> m [Tree Node]
+ Data.Graph.Inductive.Query.Monad: graphDff :: (GraphM m gr) => [Node] -> m (gr a b) -> m [Tree Node]
- Data.Graph.Inductive.Query.Monad: graphDff' :: GraphM m gr => m (gr a b) -> m [Tree Node]
+ Data.Graph.Inductive.Query.Monad: graphDff' :: (GraphM m gr) => m (gr a b) -> m [Tree Node]
- Data.Graph.Inductive.Query.Monad: graphFilter :: GraphM m gr => (Context a b -> Bool) -> m (gr a b) -> m [Context a b]
+ Data.Graph.Inductive.Query.Monad: graphFilter :: (GraphM m gr) => (Context a b -> Bool) -> m (gr a b) -> m [Context a b]
- Data.Graph.Inductive.Query.Monad: graphFilterM :: GraphM m gr => (Context a b -> Bool) -> GT m (gr a b) [Context a b]
+ Data.Graph.Inductive.Query.Monad: graphFilterM :: (GraphM m gr) => (Context a b -> Bool) -> GT m (gr a b) [Context a b]
- Data.Graph.Inductive.Query.Monad: graphNodes :: GraphM m gr => m (gr a b) -> m [Node]
+ Data.Graph.Inductive.Query.Monad: graphNodes :: (GraphM m gr) => m (gr a b) -> m [Node]
- Data.Graph.Inductive.Query.Monad: graphNodesM :: GraphM m gr => GT m (gr a b) [Node]
+ Data.Graph.Inductive.Query.Monad: graphNodesM :: (GraphM m gr) => GT m (gr a b) [Node]
- Data.Graph.Inductive.Query.Monad: graphNodesM0 :: GraphM m gr => GT m (gr a b) [Node]
+ Data.Graph.Inductive.Query.Monad: graphNodesM0 :: (GraphM m gr) => GT m (gr a b) [Node]
- Data.Graph.Inductive.Query.Monad: graphRec :: GraphM m gr => GT m (gr a b) c -> (c -> d -> d) -> d -> GT m (gr a b) d
+ Data.Graph.Inductive.Query.Monad: graphRec :: (GraphM m gr) => GT m (gr a b) c -> (c -> d -> d) -> d -> GT m (gr a b) d
- Data.Graph.Inductive.Query.Monad: graphUFold :: GraphM m gr => (Context a b -> c -> c) -> c -> GT m (gr a b) c
+ Data.Graph.Inductive.Query.Monad: graphUFold :: (GraphM m gr) => (Context a b -> c -> c) -> c -> GT m (gr a b) c
- Data.Graph.Inductive.Query.Monad: recMGT :: Monad m => (m s -> m Bool) -> GT m s a -> (a -> b -> b) -> b -> GT m s b
+ Data.Graph.Inductive.Query.Monad: recMGT :: (Monad m) => (m s -> m Bool) -> GT m s a -> (a -> b -> b) -> b -> GT m s b
- Data.Graph.Inductive.Query.Monad: recMGT' :: Monad m => (s -> Bool) -> GT m s a -> (a -> b -> b) -> b -> GT m s b
+ Data.Graph.Inductive.Query.Monad: recMGT' :: (Monad m) => (s -> Bool) -> GT m s a -> (a -> b -> b) -> b -> GT m s b
- Data.Graph.Inductive.Query.Monad: runGT :: Monad m => GT m g a -> m g -> m a
+ Data.Graph.Inductive.Query.Monad: runGT :: (Monad m) => GT m g a -> m g -> m a
- Data.Graph.Inductive.Query.Monad: sucGT :: GraphM m gr => Node -> GT m (gr a b) (Maybe [Node])
+ Data.Graph.Inductive.Query.Monad: sucGT :: (GraphM m gr) => Node -> GT m (gr a b) (Maybe [Node])
- Data.Graph.Inductive.Query.Monad: sucM :: GraphM m gr => Node -> m (gr a b) -> m (Maybe [Node])
+ Data.Graph.Inductive.Query.Monad: sucM :: (GraphM m gr) => Node -> m (gr a b) -> m (Maybe [Node])
- Data.Graph.Inductive.Query.TransClos: trc :: DynGraph gr => gr a b -> gr a ()
+ Data.Graph.Inductive.Query.TransClos: trc :: (DynGraph gr) => gr a b -> gr a ()
Files
- ChangeLog +16/−0
- Data/Graph/Inductive/Graph.hs +27/−1
- Data/Graph/Inductive/Monad/IOArray.hs +2/−0
- Data/Graph/Inductive/Monad/STArray.hs +113/−0
- Data/Graph/Inductive/NodeMap.hs +4/−4
- Data/Graph/Inductive/PatriciaTree.hs +15/−1
- Data/Graph/Inductive/Query/GVD.hs +1/−1
- Data/Graph/Inductive/Query/TransClos.hs +29/−10
- Data/Graph/Inductive/Tree.hs +15/−1
- fgl.cabal +4/−4
- test/Data/Graph/Inductive/Query/Properties.hs +33/−10
- test/TestSuite.hs +3/−1
ChangeLog view
@@ -1,3 +1,19 @@+5.5.3.0+-------++* Additional closure functions by Matthew Danish.++* `Bifunctor` instances for base >= 4.8.0.0.++* An `ST`-based `GraphM` instance.++* Addition of `order` and `size` functions for finding the number of+ nodes and edges respectively in a graph (the former is an alias for+ the existing `noNodes` function).++* The rules for faster implementations of `insNode` and `insEdge` for+ `PatriciaTree` should fire more often now.+ 5.5.2.3 -------
Data/Graph/Inductive/Graph.hs view
@@ -34,6 +34,8 @@ Graph(..), DynGraph(..), -- * Operations+ order,+ size, -- ** Graph Folds and Maps ufold,gmap,nmap,emap,nemap, -- ** Graph Projection@@ -173,8 +175,29 @@ class (Graph gr) => DynGraph gr where -- | Merge the 'Context' into the 'DynGraph'.+ --+ -- Contexts should only refer to either a Node already in a graph+ -- or the node in the Context itself (for loops). (&) :: Context a b -> gr a b -> gr a b ++-- | The number of nodes in the graph. An alias for 'noNodes'.+order :: (Graph gr) => gr a b -> Int+order = noNodes++-- | The number of edges in the graph.+--+-- Note that this counts every edge found, so if you are+-- representing an unordered graph by having each edge mirrored this+-- will be incorrect.+--+-- If you created an unordered graph by either mirroring every edge+-- (including loops!) or using the @undir@ function in+-- "Data.Graph.Inductive.Basic" then you can safely halve the value+-- returned by this.+size :: (Graph gr) => gr a b -> Int+size = length . labEdges+ -- | Fold a function over the graph. ufold :: (Graph gr) => (Context a b -> c -> c) -> c -> gr a b -> c ufold f u g@@ -252,6 +275,7 @@ (pr,_,la,su) = fromMaybe (error ("insEdge: cannot add edge from non-existent vertex " ++ show v)) mcxt+{-# NOINLINE [0] insEdge #-} -- | Remove a 'Node' from the 'Graph'. delNode :: (Graph gr) => Node -> gr a b -> gr a b@@ -272,7 +296,7 @@ -- -- NOTE: in the case of multiple edges with the same label, this -- will only delete the /first/ such edge. To delete all such--- edges, please use 'delAllLedges'.+-- edges, please use 'delAllLedge'. delLEdge :: (DynGraph gr, Eq b) => LEdge b -> gr a b -> gr a b delLEdge = delLEdgeBy delete @@ -289,10 +313,12 @@ -- | Insert multiple 'LNode's into the 'Graph'. insNodes :: (DynGraph gr) => [LNode a] -> gr a b -> gr a b insNodes vs g = foldl' (flip insNode) g vs+{-# INLINABLE insNodes #-} -- | Insert multiple 'LEdge's into the 'Graph'. insEdges :: (DynGraph gr) => [LEdge b] -> gr a b -> gr a b insEdges es g = foldl' (flip insEdge) g es+{-# INLINABLE insEdges #-} -- | Remove multiple 'Node's from the 'Graph'. delNodes :: (Graph gr) => [Node] -> gr a b -> gr a b
Data/Graph/Inductive/Monad/IOArray.hs view
@@ -46,9 +46,11 @@ Just (_,l,s) -> '\n':show v++":"++show l++"->"++show s' where s' = unsafePerformIO (removeDel m s) +-- | Please not that this instance is unsafe. instance (Show a,Show b) => Show (SGr a b) where show (SGr g) = showGraph g +-- | Please not that this instance is unsafe. instance (Show a,Show b) => Show (IO (SGr a b)) where show g = unsafePerformIO (do {(SGr g') <- g; return (showGraph g')})
+ Data/Graph/Inductive/Monad/STArray.hs view
@@ -0,0 +1,113 @@+{-# LANGUAGE FlexibleContexts, FlexibleInstances, MultiParamTypeClasses #-}++-- (c) 2002 by Martin Erwig [see file COPYRIGHT]+-- | Static IOArray-based Graphs+module Data.Graph.Inductive.Monad.STArray(+ -- * Graph Representation+ SGr(..), GraphRep, Context', USGr,+ defaultGraphSize, emptyN,+ -- * Utilities+ removeDel,+) where++import Data.Graph.Inductive.Graph+import Data.Graph.Inductive.Monad++import Control.Monad+import Control.Monad.ST+import Data.Array+import Data.Array.ST+import System.IO.Unsafe++++----------------------------------------------------------------------+-- GRAPH REPRESENTATION+----------------------------------------------------------------------++newtype SGr s a b = SGr (GraphRep s a b)++type GraphRep s a b = (Int,Array Node (Context' a b),STArray s Node Bool)+type Context' a b = Maybe (Adj b,a,Adj b)++type USGr s = SGr s () ()+++----------------------------------------------------------------------+-- CLASS INSTANCES+----------------------------------------------------------------------++-- Show+--+showGraph :: (Show a,Show b) => GraphRep RealWorld a b -> String+showGraph (_,a,m) = concatMap showAdj (indices a)+ where showAdj v | unsafeST (readArray m v) = ""+ | otherwise = case a!v of+ Nothing -> ""+ Just (_,l,s) -> '\n':show v++":"++show l++"->"++show s'+ where s' = unsafeST (removeDel m s)++unsafeST :: ST RealWorld a -> a+unsafeST = unsafePerformIO . stToIO++-- | Please not that this instance is unsafe.+instance (Show a,Show b) => Show (SGr RealWorld a b) where+ show (SGr g) = showGraph g++{-+run :: Show (IO a) => IO a -> IO ()+run x = seq x (print x)+-}++-- GraphM+--+instance GraphM (ST s) (SGr s) where+ emptyM = emptyN defaultGraphSize+ isEmptyM g = do {SGr (n,_,_) <- g; return (n==0)}+ matchM v g = do g'@(SGr (n,a,m)) <- g+ case a!v of+ Nothing -> return (Nothing,g')+ Just (pr,l,su) ->+ do b <- readArray m v+ if b then return (Nothing,g') else+ do s <- removeDel m su+ p' <- removeDel m pr+ let p = filter ((/=v).snd) p'+ writeArray m v True+ return (Just (p,v,l,s),SGr (n-1,a,m))+ mkGraphM vs es = do m <- newArray (1,n) False+ return (SGr (n,pr,m))+ where nod = array bnds (map (\(v,l)->(v,Just ([],l,[]))) vs)+ su = accum addSuc nod (map (\(v,w,l)->(v,(l,w))) es)+ pr = accum addPre su (map (\(v,w,l)->(w,(l,v))) es)+ bnds = (minimum vs',maximum vs')+ vs' = map fst vs+ n = length vs+ addSuc (Just (p,l',s)) (l,w) = Just (p,l',(l,w):s)+ addSuc Nothing _ = error "mkGraphM (SGr): addSuc Nothing"+ addPre (Just (p,l',s)) (l,w) = Just ((l,w):p,l',s)+ addPre Nothing _ = error "mkGraphM (SGr): addPre Nothing"+ labNodesM g = do (SGr (_,a,m)) <- g+ let getLNode vs (_,Nothing) = return vs+ getLNode vs (v,Just (_,l,_)) =+ do b <- readArray m v+ return (if b then vs else (v,l):vs)+ foldM getLNode [] (assocs a)++defaultGraphSize :: Int+defaultGraphSize = 100++emptyN :: Int -> ST s (SGr s a b)+emptyN n = do m <- newArray (1,n) False+ return (SGr (0,array (1,n) [(i,Nothing) | i <- [1..n]],m))++----------------------------------------------------------------------+-- UTILITIES+----------------------------------------------------------------------++++-- | filter list (of successors\/predecessors) through a boolean ST array+-- representing deleted marks+removeDel :: STArray s Node Bool -> Adj b -> ST s (Adj b)+removeDel m = filterM (\(_,v)->do {b<-readArray m v;return (not b)})
Data/Graph/Inductive/NodeMap.hs view
@@ -223,16 +223,16 @@ return r -- | Monadic node construction.-mkNodeM :: (Ord a, DynGraph g) => a -> NodeMapM a b g (LNode a)+mkNodeM :: (Ord a) => a -> NodeMapM a b g (LNode a) mkNodeM = liftN2 mkNode -mkNodesM :: (Ord a, DynGraph g) => [a] -> NodeMapM a b g [LNode a]+mkNodesM :: (Ord a) => [a] -> NodeMapM a b g [LNode a] mkNodesM = liftN2 mkNodes -mkEdgeM :: (Ord a, DynGraph g) => (a, a, b) -> NodeMapM a b g (Maybe (LEdge b))+mkEdgeM :: (Ord a) => (a, a, b) -> NodeMapM a b g (Maybe (LEdge b)) mkEdgeM = liftN2' mkEdge -mkEdgesM :: (Ord a, DynGraph g) => [(a, a, b)] -> NodeMapM a b g (Maybe [LEdge b])+mkEdgesM :: (Ord a) => [(a, a, b)] -> NodeMapM a b g (Maybe [LEdge b]) mkEdgesM = liftN2' mkEdges insMapNodeM :: (Ord a, DynGraph g) => a -> NodeMapM a b g (LNode a)
Data/Graph/Inductive/PatriciaTree.hs view
@@ -28,7 +28,6 @@ import Data.Graph.Inductive.Graph import Control.Applicative (liftA2)-import Control.Arrow (second) import Data.IntMap (IntMap) import qualified Data.IntMap as IM import Data.List (sort)@@ -42,6 +41,12 @@ import GHC.Generics (Generic) #endif +#if MIN_VERSION_base (4,8,0)+import Data.Bifunctor+#else+import Control.Arrow (second)+#endif+ ---------------------------------------------------------------------- -- GRAPH REPRESENTATION ----------------------------------------------------------------------@@ -118,6 +123,15 @@ #if MIN_VERSION_containers (0,4,2) instance (NFData a, NFData b) => NFData (Gr a b) where rnf (Gr g) = rnf g+#endif++#if MIN_VERSION_base (4,8,0)+instance Bifunctor Gr where+ bimap = fastNEMap++ first = fastNMap++ second = fastEMap #endif matchGr :: Node -> Gr a b -> Decomp Gr a b
Data/Graph/Inductive/Query/GVD.hs view
@@ -50,7 +50,7 @@ -- | Try to determine the nearest root node to the one specified in the -- shortest path forest.-nearestNode :: (Real b) => Node -> Voronoi b -> Maybe Node+nearestNode :: Node -> Voronoi b -> Maybe Node nearestNode v = fmap (fst . last . unLPath) . maybePath v -- | The distance to the 'nearestNode' (if there is one) in the
Data/Graph/Inductive/Query/TransClos.hs view
@@ -1,21 +1,40 @@ module Data.Graph.Inductive.Query.TransClos(- trc+ trc, rc, tc ) where import Data.Graph.Inductive.Graph-import Data.Graph.Inductive.Query.DFS (reachable)---getNewEdges :: (DynGraph gr) => [LNode a] -> gr a b -> [LEdge ()]-getNewEdges vs g = map (`toLEdge` ())- . concatMap (\u -> map ((,) u) (reachable u g))- $ map fst vs+import Data.Graph.Inductive.Query.BFS (bfen) {-| Finds the transitive closure of a directed graph. Given a graph G=(V,E), its transitive closure is the graph: G* = (V,E*) where E*={(i,j): i,j in V and there is a path from i to j in G} -}+tc :: (DynGraph gr) => gr a b -> gr a ()+tc g = newEdges `insEdges` insNodes ln empty+ where+ ln = labNodes g+ newEdges = [ (u, v, ()) | (u, _) <- ln, (_, v) <- bfen (outU g u) g ]+ outU gr = map toEdge . out gr++{-|+Finds the transitive, reflexive closure of a directed graph.+Given a graph G=(V,E), its transitive closure is the graph:+G* = (V,E*) where E*={(i,j): i,j in V and either i = j or there is a path from i to j in G}+-} trc :: (DynGraph gr) => gr a b -> gr a ()-trc g = insEdges (getNewEdges ln g) (insNodes ln empty)- where ln = labNodes g+trc g = newEdges `insEdges` insNodes ln empty+ where+ ln = labNodes g+ newEdges = [ (u, v, ()) | (u, _) <- ln, (_, v) <- bfen [(u, u)] g ]++{-|+Finds the reflexive closure of a directed graph.+Given a graph G=(V,E), its transitive closure is the graph:+G* = (V,Er union E) where Er = {(i,i): i in V}+-}+rc :: (DynGraph gr) => gr a b -> gr a ()+rc g = newEdges `insEdges` insNodes ln empty+ where+ ln = labNodes g+ newEdges = [ (u, u, ()) | (u, _) <- ln ]
Data/Graph/Inductive/Tree.hs view
@@ -14,7 +14,6 @@ import Data.Graph.Inductive.Graph import Control.Applicative (liftA2)-import Control.Arrow (first, second) import Data.List (foldl', sort) import Data.Map (Map) import qualified Data.Map as M@@ -28,6 +27,12 @@ import GHC.Generics (Generic) #endif +#if MIN_VERSION_base (4,8,0)+import Data.Bifunctor+#else+import Control.Arrow (first, second)+#endif+ ---------------------------------------------------------------------- -- GRAPH REPRESENTATION ----------------------------------------------------------------------@@ -128,6 +133,15 @@ #if MIN_VERSION_containers (0,4,2) instance (NFData a, NFData b) => NFData (Gr a b) where rnf (Gr g) = rnf g+#endif++#if MIN_VERSION_base (4,8,0)+instance Bifunctor Gr where+ bimap = nemap++ first = nmap++ second = emap #endif ----------------------------------------------------------------------
fgl.cabal view
@@ -1,5 +1,5 @@ name: fgl-version: 5.5.2.3+version: 5.5.3.0 license: BSD3 license-file: LICENSE author: Martin Erwig, Ivan Lazar Miljenovic@@ -18,7 +18,7 @@ ChangeLog tested-with: GHC == 7.0.4, GHC == 7.2.2, GHC == 7.4.2, GHC == 7.6.3,- GHC == 7.8.4, GHC == 7.10.2, GHC == 7.11.*+ GHC == 7.8.4, GHC == 7.10.2, GHC == 8.0.1, GHC == 8.1.* source-repository head type: git@@ -46,6 +46,7 @@ Data.Graph.Inductive.Query, Data.Graph.Inductive.Tree, Data.Graph.Inductive.Monad.IOArray,+ Data.Graph.Inductive.Monad.STArray, Data.Graph.Inductive.Query.ArtPoint, Data.Graph.Inductive.Query.BCC, Data.Graph.Inductive.Query.BFS,@@ -89,7 +90,7 @@ build-depends: fgl , base- , QuickCheck >= 2.8 && < 2.9+ , QuickCheck >= 2.8 && < 2.10 , hspec >= 2.1 && < 2.3 , containers @@ -105,5 +106,4 @@ ghc-options: -Wall - ghc-prof-options: -prof -auto }
test/Data/Graph/Inductive/Query/Properties.hs view
@@ -26,7 +26,7 @@ import Test.QuickCheck import Control.Arrow (second)-import Data.List (delete, sort, unfoldr)+import Data.List (delete, sort, unfoldr, group, (\\)) import qualified Data.Set as S #if __GLASGOW_HASKELL__ < 710@@ -327,18 +327,41 @@ -- ----------------------------------------------------------------------------- -- TransClos -test_trc :: (ArbGraph gr, Eq (BaseGraph gr a ())) => Proxy (gr a b)- -> UConnected (SimpleGraph gr) a ()- -> Bool-test_trc _ cg = gReach == trc g+-- | The transitive, reflexive closure of a graph means that every+-- node is a successor of itself, and also that if (a, b) is an edge,+-- and (b, c) is an edge, then (a, c) must also be an edge.+test_trc :: DynGraph gr => Proxy (gr a b) -> (NoMultipleEdges gr) a b -> Bool+test_trc _ nme = all valid $ nodes gTrans where- g = connGraph cg+ g = emap (const ()) (nmeGraph nme)+ gTrans = trc g+ valid n =+ -- For each node n, check that:+ -- the successors for n in gTrans are a superset of the successors for n in g.+ null (suc g n \\ suc gTrans n) &&+ -- the successors for n in gTrans are exactly equal to the reachable nodes for n in g, plus n.+ sort (suc gTrans n) == map head (group (sort (n:[ v | u <- suc g n, v <- reachable u g ]))) - lns = labNodes g+-- | The transitive closure of a graph means that if (a, b) is an+-- edge, and (b, c) is an edge, then (a, c) must also be an edge.+test_tc :: DynGraph gr => Proxy (gr a b) -> (NoMultipleEdges gr) a b -> Bool+test_tc _ nme = all valid $ nodes gTrans+ where+ g = nmeGraph nme+ gTrans = tc g+ valid n =+ -- For each node n, check that:+ -- the successors for n in gTrans are a superset of the successors for n in g.+ null (suc g n \\ suc gTrans n) &&+ -- the successors for n in gTrans are exactly equal to the reachable nodes for n in g.+ sort (suc gTrans n) == map head (group (sort [ v | u <- suc g n, v <- reachable u g ])) - gReach = (`asTypeOf` g)- . insEdges [(v,w,()) | (v,_) <- lns, (w,_) <- lns]- $ mkGraph lns []+-- | The reflexive closure of a graph means that all nodes are a+-- successor of themselves.+test_rc :: DynGraph gr => Proxy (gr a b) -> gr a b -> Bool+test_rc _ g = and [ n `elem` suc gRefl n | n <- nodes gRefl ]+ where+ gRefl = rc g -- ----------------------------------------------------------------------------- -- Utility functions
test/TestSuite.hs view
@@ -117,9 +117,11 @@ test_maxFlow propP "msTree" test_msTree propP "sp" test_sp- keepSmall $+ keepSmall $ do -- Just producing the sample graph to compare against is O(|V|^2) propP "trc" test_trc+ propP "tc" test_tc+ propP "rc" test_rc where propP str = prop str . ($p)