-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Graph library using unordered-containers
--
-- Simple graph library allowing any Hashable instance to be a node type.
@package unordered-graphs
@version 0.1.0
module Data.Graph.Unordered.Internal
data Graph et n nl el
Gr :: !(NodeMap n nl) -> !(EdgeMap et n el) -> !Edge -> Graph et n nl el
[nodeMap] :: Graph et n nl el -> !(NodeMap n nl)
[edgeMap] :: Graph et n nl el -> !(EdgeMap et n el)
[nextEdge] :: Graph et n nl el -> !Edge
type NodeMap n nl = HashMap n (Adj, nl)
type EdgeMap et n el = HashMap Edge (et n, el)
newtype Edge
Edge :: Word -> Edge
[unEdge] :: Edge -> Word
type Set n = HashMap n ()
mkSet :: (Eq n, Hashable n) => [n] -> Set n
type Adj = HashMap Edge Int
adjCount :: (Eq n) => n -> n -> Int
type ValidGraph et n = (Hashable n, Eq n, EdgeType et)
-- | Assumes all nodes are in the node list.
mkGraph :: (ValidGraph et n) => [(n, nl)] -> [(n, n, el)] -> Graph et n nl el
class (Functor et, NodeFrom (AdjType et)) => EdgeType et where type family AdjType et :: * -> *
mkEdge :: EdgeType et => n -> n -> et n
-- | Assumes n is one of the end points of this edge.
otherN :: (EdgeType et, Eq n) => n -> et n -> AdjType et n
toEdge :: EdgeType et => n -> AdjType et n -> et n
-- | Returns a list of length 2.
edgeNodes :: EdgeType et => et n -> [n]
edgeTriple :: EdgeType et => (et n, el) -> (n, n, el)
class NodeFrom at
getNode :: NodeFrom at => at n -> n
nodeDetails :: Graph et n nl el -> [(n, ([Edge], nl))]
lnodes :: Graph et n nl el -> [(n, nl)]
edges :: Graph et n nl el -> [Edge]
edgeDetails :: Graph et n nl el -> [(Edge, (et n, el))]
ledges :: Graph et n nl el -> [(Edge, el)]
edgePairs :: (EdgeType et) => Graph et n nl el -> [(n, n)]
ledgePairs :: (EdgeType et) => Graph et n nl el -> [(n, n, el)]
degNM :: (Eq n, Hashable n) => NodeMap n nl -> n -> Int
withNodeMap :: (NodeMap n nl -> NodeMap n nl') -> Graph et n nl el -> Graph et n nl' el
withEdgeMap :: (EdgeMap et n el -> EdgeMap et n el') -> Graph et n nl el -> Graph et n nl el'
instance Control.DeepSeq.NFData Data.Graph.Unordered.Internal.Edge
instance GHC.Enum.Bounded Data.Graph.Unordered.Internal.Edge
instance GHC.Enum.Enum Data.Graph.Unordered.Internal.Edge
instance Data.Hashable.Class.Hashable Data.Graph.Unordered.Internal.Edge
instance GHC.Read.Read Data.Graph.Unordered.Internal.Edge
instance GHC.Show.Show Data.Graph.Unordered.Internal.Edge
instance GHC.Classes.Ord Data.Graph.Unordered.Internal.Edge
instance GHC.Classes.Eq Data.Graph.Unordered.Internal.Edge
instance (GHC.Classes.Eq (et n), GHC.Classes.Eq n, GHC.Classes.Eq nl, GHC.Classes.Eq el) => GHC.Classes.Eq (Data.Graph.Unordered.Internal.Graph et n nl el)
instance (Data.Graph.Unordered.Internal.EdgeType et, GHC.Show.Show n, GHC.Show.Show nl, GHC.Show.Show el) => GHC.Show.Show (Data.Graph.Unordered.Internal.Graph et n nl el)
instance (Data.Graph.Unordered.Internal.ValidGraph et n, GHC.Read.Read n, GHC.Read.Read nl, GHC.Read.Read el) => GHC.Read.Read (Data.Graph.Unordered.Internal.Graph et n nl el)
instance (Control.DeepSeq.NFData n, Control.DeepSeq.NFData (et n), Control.DeepSeq.NFData nl, Control.DeepSeq.NFData el) => Control.DeepSeq.NFData (Data.Graph.Unordered.Internal.Graph et n nl el)
instance Data.Graph.Unordered.Internal.NodeFrom Data.Functor.Identity.Identity
module Data.Graph.Unordered.Algorithms.Subgraphs
subgraph :: (ValidGraph et n) => Graph et n nl el -> [n] -> Graph et n nl el
isSubGraphOf :: (ValidGraph et n, Eq (et n), Eq nl, Eq el) => Graph et n nl el -> Graph et n nl el -> Bool
-- | Known limitations:
--
--
-- - Adding edges might not be the same depending on graph construction
-- (if you add then delete a lot of edges, then the next new edge might
-- be higher than expected).
--
module Data.Graph.Unordered
data Graph et n nl el
type DirGraph = Graph DirEdge
type UndirGraph = Graph UndirEdge
type ValidGraph et n = (Hashable n, Eq n, EdgeType et)
newtype Edge
Edge :: Word -> Edge
[unEdge] :: Edge -> Word
data DirEdge n
DE :: !n -> !n -> DirEdge n
[fromNode] :: DirEdge n -> !n
[toNode] :: DirEdge n -> !n
newtype UndirEdge n
UE :: [n] -> UndirEdge n
[ueElem] :: UndirEdge n -> [n]
class (Functor et, NodeFrom (AdjType et)) => EdgeType et where type family AdjType et :: * -> *
mkEdge :: EdgeType et => n -> n -> et n
-- | Assumes n is one of the end points of this edge.
otherN :: (EdgeType et, Eq n) => n -> et n -> AdjType et n
toEdge :: EdgeType et => n -> AdjType et n -> et n
-- | Returns a list of length 2.
edgeNodes :: EdgeType et => et n -> [n]
edgeTriple :: EdgeType et => (et n, el) -> (n, n, el)
class NodeFrom at
getNode :: NodeFrom at => at n -> n
data DirAdj n
ToNode :: n -> DirAdj n
FromNode :: n -> DirAdj n
-- | Identity functor and monad. (a non-strict monad)
newtype Identity a :: * -> *
Identity :: a -> Identity a
[runIdentity] :: Identity a -> a
data Context at n nl el
Ctxt :: !n -> !nl -> !(AdjLookup (at n) el) -> Context at n nl el
[cNode] :: Context at n nl el -> !n
[cLabel] :: Context at n nl el -> !nl
[cAdj] :: Context at n nl el -> !(AdjLookup (at n) el)
type AdjLookup n el = HashMap Edge (n, el)
class Contextual ctxt where type family CNode ctxt :: * type family CAType ctxt :: * -> * type family CNLabel ctxt :: * type family CELabel ctxt :: *
type ValidContext et n nl el ctxt = (Contextual ctxt, n ~ CNode ctxt, AdjType et ~ CAType ctxt, nl ~ CNLabel ctxt, el ~ CELabel ctxt)
class (Contextual ctxt) => FromContext ctxt
fromContext :: FromContext ctxt => Context (CAType ctxt) (CNode ctxt) (CNLabel ctxt) (CELabel ctxt) -> ctxt
class (Contextual ctxt) => ToContext ctxt
toContext :: ToContext ctxt => ctxt -> Context (CAType ctxt) (CNode ctxt) (CNLabel ctxt) (CELabel ctxt)
isEmpty :: Graph et n nl el -> Bool
-- | Number of nodes
order :: Graph et n nl el -> Int
hasNode :: (ValidGraph et n) => Graph et n nl el -> n -> Bool
ninfo :: (ValidGraph et n) => Graph et n nl el -> n -> Maybe ([Edge], nl)
nodes :: Graph et n nl el -> [n]
nodeDetails :: Graph et n nl el -> [(n, ([Edge], nl))]
lnodes :: Graph et n nl el -> [(n, nl)]
nlab :: (ValidGraph et n) => Graph et n nl el -> n -> Maybe nl
neighbours :: (ValidGraph et n) => Graph et n nl el -> n -> [n]
-- | Number of edges
size :: Graph et n nl el -> Int
hasEdge :: (ValidGraph et n) => Graph et n nl el -> Edge -> Bool
einfo :: (ValidGraph et n) => Graph et n nl el -> Edge -> Maybe (et n, el)
edges :: Graph et n nl el -> [Edge]
edgeDetails :: Graph et n nl el -> [(Edge, (et n, el))]
ledges :: Graph et n nl el -> [(Edge, el)]
elab :: (ValidGraph et n) => Graph et n nl el -> Edge -> Maybe el
edgePairs :: (EdgeType et) => Graph et n nl el -> [(n, n)]
ledgePairs :: (EdgeType et) => Graph et n nl el -> [(n, n, el)]
empty :: Graph et n nl el
-- | Assumes all nodes are in the node list.
mkGraph :: (ValidGraph et n) => [(n, nl)] -> [(n, n, el)] -> Graph et n nl el
-- | Assumes the Contexts describe a graph in total, with the outermost one
-- first (i.e. buildGr (c:cs) == c merge buildGr cs).
buildGr :: (ValidGraph et n) => [Context (AdjType et) n nl el] -> Graph et n nl el
insNode :: (ValidGraph et n) => n -> nl -> Graph et n nl el -> Graph et n nl el
insEdge :: (ValidGraph et n) => (n, n, el) -> Graph et n nl el -> (Edge, Graph et n nl el)
type Mergeable et n nl el ctxt = (ValidGraph et n, ToContext ctxt, ValidContext et n nl el ctxt)
merge :: (ValidGraph et n) => Context (AdjType et) n nl el -> Graph et n nl el -> Graph et n nl el
mergeAs :: (Mergeable et n nl el ctxt) => ctxt -> Graph et n nl el -> Graph et n nl el
delNode :: (ValidGraph et n) => n -> Graph et n nl el -> Graph et n nl el
delEdge :: (ValidGraph et n) => Edge -> Graph et n nl el -> Graph et n nl el
delEdgeLabel :: (ValidGraph et n, Eq el) => (n, n, el) -> Graph et n nl el -> Graph et n nl el
delEdgesBetween :: (ValidGraph et n) => n -> n -> Graph et n nl el -> Graph et n nl el
type Matchable et n nl el ctxt = (ValidGraph et n, FromContext ctxt, ValidContext et n nl el ctxt)
-- | Note that for any loops, the resultant edge will only appear once in
-- the output cAdj field.
match :: (ValidGraph et n) => n -> Graph et n nl el -> Maybe (Context (AdjType et) n nl el, Graph et n nl el)
matchAs :: (Matchable et n nl el ctxt) => n -> Graph et n nl el -> Maybe (ctxt, Graph et n nl el)
matchAny :: (ValidGraph et n) => Graph et n nl el -> Maybe (Context (AdjType et) n nl el, Graph et n nl el)
matchAnyAs :: (Matchable et n nl el ctxt) => Graph et n nl el -> Maybe (ctxt, Graph et n nl el)
nmap :: (ValidGraph et n) => (nl -> nl') -> Graph et n nl el -> Graph et n nl' el
nmapFor :: (ValidGraph et n) => (nl -> nl) -> Graph et n nl el -> n -> Graph et n nl el
emap :: (ValidGraph et n) => (el -> el') -> Graph et n nl el -> Graph et n nl el'
emapFor :: (ValidGraph et n) => (el -> el) -> Graph et n nl el -> Edge -> Graph et n nl el
instance GHC.Generics.Selector Data.Graph.Unordered.S1_0_2Context
instance GHC.Generics.Selector Data.Graph.Unordered.S1_0_1Context
instance GHC.Generics.Selector Data.Graph.Unordered.S1_0_0Context
instance GHC.Generics.Constructor Data.Graph.Unordered.C1_0Context
instance GHC.Generics.Datatype Data.Graph.Unordered.D1Context
instance GHC.Generics.Constructor Data.Graph.Unordered.C1_1DirAdj
instance GHC.Generics.Constructor Data.Graph.Unordered.C1_0DirAdj
instance GHC.Generics.Datatype Data.Graph.Unordered.D1DirAdj
instance GHC.Generics.Selector Data.Graph.Unordered.S1_0_0UndirEdge
instance GHC.Generics.Constructor Data.Graph.Unordered.C1_0UndirEdge
instance GHC.Generics.Datatype Data.Graph.Unordered.D1UndirEdge
instance GHC.Generics.Selector Data.Graph.Unordered.S1_0_1DirEdge
instance GHC.Generics.Selector Data.Graph.Unordered.S1_0_0DirEdge
instance GHC.Generics.Constructor Data.Graph.Unordered.C1_0DirEdge
instance GHC.Generics.Datatype Data.Graph.Unordered.D1DirEdge
instance (Control.DeepSeq.NFData n, Control.DeepSeq.NFData nl, Control.DeepSeq.NFData el, Control.DeepSeq.NFData (at n)) => Control.DeepSeq.NFData (Data.Graph.Unordered.Context at n nl el)
instance GHC.Generics.Generic (Data.Graph.Unordered.Context at n nl el)
instance (GHC.Read.Read n, GHC.Read.Read nl, GHC.Read.Read el, GHC.Read.Read (at n)) => GHC.Read.Read (Data.Graph.Unordered.Context at n nl el)
instance (GHC.Show.Show n, GHC.Show.Show nl, GHC.Show.Show el, GHC.Show.Show (at n)) => GHC.Show.Show (Data.Graph.Unordered.Context at n nl el)
instance (GHC.Classes.Eq n, GHC.Classes.Eq nl, GHC.Classes.Eq el, GHC.Classes.Eq (at n)) => GHC.Classes.Eq (Data.Graph.Unordered.Context at n nl el)
instance Control.DeepSeq.NFData n => Control.DeepSeq.NFData (Data.Graph.Unordered.DirAdj n)
instance GHC.Generics.Generic (Data.Graph.Unordered.DirAdj n)
instance GHC.Read.Read n => GHC.Read.Read (Data.Graph.Unordered.DirAdj n)
instance GHC.Show.Show n => GHC.Show.Show (Data.Graph.Unordered.DirAdj n)
instance GHC.Classes.Ord n => GHC.Classes.Ord (Data.Graph.Unordered.DirAdj n)
instance GHC.Classes.Eq n => GHC.Classes.Eq (Data.Graph.Unordered.DirAdj n)
instance Control.DeepSeq.NFData n => Control.DeepSeq.NFData (Data.Graph.Unordered.UndirEdge n)
instance GHC.Generics.Generic (Data.Graph.Unordered.UndirEdge n)
instance GHC.Base.Functor Data.Graph.Unordered.UndirEdge
instance GHC.Read.Read n => GHC.Read.Read (Data.Graph.Unordered.UndirEdge n)
instance GHC.Show.Show n => GHC.Show.Show (Data.Graph.Unordered.UndirEdge n)
instance GHC.Classes.Ord n => GHC.Classes.Ord (Data.Graph.Unordered.UndirEdge n)
instance GHC.Classes.Eq n => GHC.Classes.Eq (Data.Graph.Unordered.UndirEdge n)
instance Control.DeepSeq.NFData n => Control.DeepSeq.NFData (Data.Graph.Unordered.DirEdge n)
instance GHC.Generics.Generic (Data.Graph.Unordered.DirEdge n)
instance GHC.Base.Functor Data.Graph.Unordered.DirEdge
instance GHC.Read.Read n => GHC.Read.Read (Data.Graph.Unordered.DirEdge n)
instance GHC.Show.Show n => GHC.Show.Show (Data.Graph.Unordered.DirEdge n)
instance GHC.Classes.Ord n => GHC.Classes.Ord (Data.Graph.Unordered.DirEdge n)
instance GHC.Classes.Eq n => GHC.Classes.Eq (Data.Graph.Unordered.DirEdge n)
instance Data.Graph.Unordered.Internal.NodeFrom Data.Graph.Unordered.DirAdj
instance Data.Graph.Unordered.Internal.EdgeType Data.Graph.Unordered.DirEdge
instance Data.Graph.Unordered.Internal.EdgeType Data.Graph.Unordered.UndirEdge
instance Data.Graph.Unordered.Contextual (Data.Graph.Unordered.Context at n nl el)
instance Data.Graph.Unordered.FromContext (Data.Graph.Unordered.Context at n nl el)
instance Data.Graph.Unordered.ToContext (Data.Graph.Unordered.Context at n nl el)
instance Data.Graph.Unordered.Contextual (n, nl, Data.Graph.Unordered.AdjLookup (at n) el)
instance Data.Graph.Unordered.FromContext (n, nl, Data.Graph.Unordered.AdjLookup (at n) el)
instance Data.Graph.Unordered.ToContext (n, nl, Data.Graph.Unordered.AdjLookup (at n) el)
instance Data.Graph.Unordered.Contextual (n, nl, [(n, [el])])
instance GHC.Classes.Ord n => Data.Graph.Unordered.FromContext (n, nl, [(n, [el])])
module Data.Graph.Unordered.Algorithms.Clustering
-- | Find communities in weighted graphs using the algorithm by Blondel,
-- Guillaume, Lambiotte and Lefebvre in their paper Fast unfolding of
-- communities in large networks.
bgll :: (ValidGraph et n, EdgeMergeable et, Fractional el, Ord el) => Graph et n nl el -> [[n]]
class (EdgeType et) => EdgeMergeable et
instance (GHC.Classes.Eq n, GHC.Read.Read n, GHC.Read.Read el, Data.Hashable.Class.Hashable n, Data.Graph.Unordered.Internal.EdgeType et) => GHC.Read.Read (Data.Graph.Unordered.Algorithms.Clustering.CGraph et n el)
instance (GHC.Show.Show n, GHC.Show.Show el, Data.Graph.Unordered.Internal.EdgeType et) => GHC.Show.Show (Data.Graph.Unordered.Algorithms.Clustering.CGraph et n el)
instance Data.Hashable.Class.Hashable Data.Graph.Unordered.Algorithms.Clustering.Community
instance GHC.Enum.Bounded Data.Graph.Unordered.Algorithms.Clustering.Community
instance GHC.Enum.Enum Data.Graph.Unordered.Algorithms.Clustering.Community
instance GHC.Read.Read Data.Graph.Unordered.Algorithms.Clustering.Community
instance GHC.Show.Show Data.Graph.Unordered.Algorithms.Clustering.Community
instance GHC.Classes.Ord Data.Graph.Unordered.Algorithms.Clustering.Community
instance GHC.Classes.Eq Data.Graph.Unordered.Algorithms.Clustering.Community
instance (GHC.Classes.Eq n, GHC.Classes.Eq el, GHC.Classes.Eq (et [n])) => GHC.Classes.Eq (Data.Graph.Unordered.Algorithms.Clustering.CGraph et n el)
instance Data.Graph.Unordered.Algorithms.Clustering.EdgeMergeable Data.Graph.Unordered.DirEdge
instance Data.Graph.Unordered.Algorithms.Clustering.EdgeMergeable Data.Graph.Unordered.UndirEdge
instance GHC.Base.Functor (Data.Graph.Unordered.Algorithms.Clustering.StateL s)
instance GHC.Base.Applicative (Data.Graph.Unordered.Algorithms.Clustering.StateL s)
module Data.Graph.Unordered.Algorithms.Components
-- | Calculate connected components of a graph; edge directionality doesn't
-- matter.
components :: (ValidGraph et n) => Graph et n nl el -> [Graph et n nl el]
getComponent :: (ValidGraph et n) => Graph et n nl el -> Maybe (Graph et n nl el, Graph et n nl el)
getComponentFrom :: (ValidGraph et n) => Context (AdjType et) n nl el -> Graph et n nl el -> (Graph et n nl el, Graph et n nl el)