graphs 0.1 → 0.2
raw patch · 9 files changed
+274/−88 lines, 9 files
Files
- Data/Graph/AdjacencyMatrix.hs +2/−0
- Data/Graph/Class.hs +82/−10
- Data/Graph/Class/AdjacencyList.hs +56/−2
- Data/Graph/Class/AdjacencyMatrix.hs +27/−0
- Data/Graph/Class/Bidirectional.hs +51/−1
- Data/Graph/Class/EdgeEnumerable.hs +28/−0
- Data/Graph/Class/VertexEnumerable.hs +27/−0
- Data/Graph/Empty.hs +0/−73
- graphs.cabal +1/−2
Data/Graph/AdjacencyMatrix.hs view
@@ -53,3 +53,5 @@ then Just ix else Nothing where ix = (i, j)++
Data/Graph/Class.hs view
@@ -13,6 +13,10 @@ module Data.Graph.Class ( Graph(..)+ , VertexMap+ , EdgeMap+ , liftVertexMap+ , liftEdgeMap ) where import Control.Monad@@ -20,36 +24,104 @@ import qualified Control.Monad.Trans.State.Lazy as Lazy import qualified Control.Monad.Trans.Writer.Strict as Strict import qualified Control.Monad.Trans.Writer.Lazy as Lazy+import qualified Control.Monad.Trans.RWS.Strict as Strict+import qualified Control.Monad.Trans.RWS.Lazy as Lazy+import Control.Monad.Trans.Identity+import Control.Monad.Trans.Maybe+import Control.Monad.Trans.Error+import Control.Monad.Trans.Reader import Control.Monad.Trans.Class+import Data.Functor.Identity import Data.Monoid import Data.Graph.PropertyMap+import Data.Void +type VertexMap g = PropertyMap g (Vertex g)+type EdgeMap g = PropertyMap g (Edge g)+ class (Monad g, Eq (Vertex g), Eq (Edge g)) => Graph g where type Vertex g :: * type Edge g :: * - vertexMap :: a -> g (PropertyMap g (Vertex g) a)- edgeMap :: a -> g (PropertyMap g (Edge g) a)+ vertexMap :: a -> g (VertexMap g a)+ edgeMap :: a -> g (EdgeMap g a) +liftVertexMap :: (MonadTrans t, Graph (t g), Graph g, Vertex (t g) ~ Vertex g) + => a -> t g (VertexMap (t g) a)+liftVertexMap = lift . liftM liftPropertyMap . vertexMap+{-# INLINE liftVertexMap #-}++liftEdgeMap :: (MonadTrans t, Graph (t g), Graph g, Edge (t g) ~ Edge g) + => a -> t g (EdgeMap (t g) a)+liftEdgeMap = lift . liftM liftPropertyMap . edgeMap+{-# INLINE liftEdgeMap #-}+ instance Graph g => Graph (Strict.StateT s g) where type Vertex (Strict.StateT s g) = Vertex g type Edge (Strict.StateT s g) = Edge g- vertexMap = lift . liftM liftPropertyMap . vertexMap- edgeMap = lift . liftM liftPropertyMap . edgeMap+ vertexMap = liftVertexMap+ edgeMap = liftEdgeMap instance Graph g => Graph (Lazy.StateT s g) where type Vertex (Lazy.StateT s g) = Vertex g type Edge (Lazy.StateT s g) = Edge g- vertexMap = lift . liftM liftPropertyMap . vertexMap- edgeMap = lift . liftM liftPropertyMap . edgeMap+ vertexMap = liftVertexMap+ edgeMap = liftEdgeMap instance (Graph g, Monoid m) => Graph (Strict.WriterT m g) where type Vertex (Strict.WriterT m g) = Vertex g type Edge (Strict.WriterT m g) = Edge g- vertexMap = lift . liftM liftPropertyMap . vertexMap- edgeMap = lift . liftM liftPropertyMap . edgeMap+ vertexMap = liftVertexMap+ edgeMap = liftEdgeMap instance (Graph g, Monoid m) => Graph (Lazy.WriterT m g) where type Vertex (Lazy.WriterT m g) = Vertex g type Edge (Lazy.WriterT m g) = Edge g- vertexMap = lift . liftM liftPropertyMap . vertexMap- edgeMap = lift . liftM liftPropertyMap . edgeMap+ vertexMap = liftVertexMap+ edgeMap = liftEdgeMap++instance Graph g => Graph (ReaderT m g) where+ type Vertex (ReaderT m g) = Vertex g + type Edge (ReaderT m g) = Edge g+ vertexMap = liftVertexMap+ edgeMap = liftEdgeMap++instance Graph g => Graph (IdentityT g) where+ type Vertex (IdentityT g) = Vertex g+ type Edge (IdentityT g) = Edge g+ vertexMap = liftVertexMap+ edgeMap = liftEdgeMap++instance Graph g => Graph (MaybeT g) where+ type Vertex (MaybeT g) = Vertex g+ type Edge (MaybeT g) = Edge g+ vertexMap = liftVertexMap+ edgeMap = liftEdgeMap++instance (Graph g, Error e) => Graph (ErrorT e g) where+ type Vertex (ErrorT e g) = Vertex g+ type Edge (ErrorT e g) = Edge g+ vertexMap = liftVertexMap+ edgeMap = liftEdgeMap++instance (Graph g, Monoid w) => Graph (Lazy.RWST r w s g) where+ type Vertex (Lazy.RWST r w s g) = Vertex g+ type Edge (Lazy.RWST r w s g) = Edge g+ vertexMap = liftVertexMap+ edgeMap = liftEdgeMap++instance (Graph g, Monoid w) => Graph (Strict.RWST r w s g) where+ type Vertex (Strict.RWST r w s g) = Vertex g+ type Edge (Strict.RWST r w s g) = Edge g+ vertexMap = liftVertexMap+ edgeMap = liftEdgeMap++voidMap :: PropertyMap Identity Void a+voidMap = PropertyMap (Identity . void) $ \_ _ -> Identity voidMap++-- | The empty graph+instance Graph Identity where+ type Vertex Identity = Void+ type Edge Identity = Void+ vertexMap _ = Identity voidMap + edgeMap _ = Identity voidMap+
Data/Graph/Class/AdjacencyList.hs view
@@ -17,12 +17,19 @@ , module Data.Graph.Class ) where +import Control.Monad+import Control.Monad.Trans.Class import qualified Control.Monad.Trans.State.Strict as Strict import qualified Control.Monad.Trans.State.Lazy as Lazy import qualified Control.Monad.Trans.Writer.Strict as Strict import qualified Control.Monad.Trans.Writer.Lazy as Lazy-import Control.Monad-import Control.Monad.Trans.Class+import qualified Control.Monad.Trans.RWS.Strict as Strict+import qualified Control.Monad.Trans.RWS.Lazy as Lazy+import Control.Monad.Trans.Identity+import Control.Monad.Trans.Maybe+import Control.Monad.Trans.Error+import Control.Monad.Trans.Reader+import Data.Functor.Identity import Data.Monoid import Data.Graph.Class @@ -73,3 +80,50 @@ outEdges = lift . outEdges outDegree = lift . outDegree +instance (AdjacencyListGraph g, Monoid m) => AdjacencyListGraph (Strict.RWST r m s g) where+ adjacentVertices = lift . adjacentVertices+ source = lift . source+ target = lift . target+ outEdges = lift . outEdges+ outDegree = lift . outDegree++instance (AdjacencyListGraph g, Monoid m) => AdjacencyListGraph (Lazy.RWST r m s g) where+ adjacentVertices = lift . adjacentVertices+ source = lift . source+ target = lift . target+ outEdges = lift . outEdges+ outDegree = lift . outDegree++instance AdjacencyListGraph g => AdjacencyListGraph (ReaderT e g) where+ adjacentVertices = lift . adjacentVertices+ source = lift . source+ target = lift . target+ outEdges = lift . outEdges+ outDegree = lift . outDegree++instance (AdjacencyListGraph g, Error e) => AdjacencyListGraph (ErrorT e g) where+ adjacentVertices = lift . adjacentVertices+ source = lift . source+ target = lift . target+ outEdges = lift . outEdges+ outDegree = lift . outDegree++instance AdjacencyListGraph g => AdjacencyListGraph (MaybeT g) where+ adjacentVertices = lift . adjacentVertices+ source = lift . source+ target = lift . target+ outEdges = lift . outEdges+ outDegree = lift . outDegree++instance AdjacencyListGraph g => AdjacencyListGraph (IdentityT g) where+ adjacentVertices = lift . adjacentVertices+ source = lift . source+ target = lift . target+ outEdges = lift . outEdges+ outDegree = lift . outDegree++instance AdjacencyListGraph Identity where+ source = Identity+ target = Identity+ outEdges _ = Identity []+ outDegree _ = Identity 0
Data/Graph/Class/AdjacencyMatrix.hs view
@@ -20,7 +20,14 @@ import qualified Control.Monad.Trans.State.Lazy as Lazy import qualified Control.Monad.Trans.Writer.Strict as Strict import qualified Control.Monad.Trans.Writer.Lazy as Lazy+import qualified Control.Monad.Trans.RWS.Strict as Strict+import qualified Control.Monad.Trans.RWS.Lazy as Lazy+import Control.Monad.Trans.Reader+import Control.Monad.Trans.Maybe+import Control.Monad.Trans.Identity+import Control.Monad.Trans.Error import Control.Monad.Trans.Class+import Data.Functor.Identity import Data.Monoid import Data.Graph.Class @@ -39,3 +46,23 @@ instance (AdjacencyMatrixGraph g, Monoid m) => AdjacencyMatrixGraph (Lazy.WriterT m g) where edge a b = lift (edge a b) +instance (AdjacencyMatrixGraph g, Monoid m) => AdjacencyMatrixGraph (Strict.RWST r m s g) where+ edge a b = lift (edge a b)++instance (AdjacencyMatrixGraph g, Monoid m) => AdjacencyMatrixGraph (Lazy.RWST r m s g) where+ edge a b = lift (edge a b)++instance AdjacencyMatrixGraph g => AdjacencyMatrixGraph (MaybeT g) where+ edge a b = lift (edge a b)++instance (AdjacencyMatrixGraph g, Error e) => AdjacencyMatrixGraph (ErrorT e g) where+ edge a b = lift (edge a b)++instance AdjacencyMatrixGraph g => AdjacencyMatrixGraph (IdentityT g) where+ edge a b = lift (edge a b)++instance AdjacencyMatrixGraph g => AdjacencyMatrixGraph (ReaderT e g) where+ edge a b = lift (edge a b)++instance AdjacencyMatrixGraph Identity where+ edge _ _ = Identity Nothing
Data/Graph/Class/Bidirectional.hs view
@@ -17,11 +17,18 @@ ) where import Control.Monad+import Control.Monad.Trans.Class import qualified Control.Monad.Trans.State.Strict as Strict import qualified Control.Monad.Trans.State.Lazy as Lazy import qualified Control.Monad.Trans.Writer.Strict as Strict import qualified Control.Monad.Trans.Writer.Lazy as Lazy-import Control.Monad.Trans.Class+import qualified Control.Monad.Trans.RWS.Strict as Strict+import qualified Control.Monad.Trans.RWS.Lazy as Lazy+import Control.Monad.Trans.Reader+import Control.Monad.Trans.Identity+import Control.Monad.Trans.Maybe+import Control.Monad.Trans.Error+import Data.Functor.Identity import Data.Monoid import Data.Graph.Class.AdjacencyList @@ -61,3 +68,46 @@ inDegree = lift . inDegree incidentEdges = lift . incidentEdges degree = lift . degree++instance (BidirectionalGraph g, Monoid m) => BidirectionalGraph (Strict.RWST r m s g) where+ inEdges = lift . inEdges+ inDegree = lift . inDegree+ incidentEdges = lift . incidentEdges+ degree = lift . degree++instance (BidirectionalGraph g, Monoid m) => BidirectionalGraph (Lazy.RWST r m s g) where+ inEdges = lift . inEdges+ inDegree = lift . inDegree+ incidentEdges = lift . incidentEdges+ degree = lift . degree++instance BidirectionalGraph g => BidirectionalGraph (ReaderT e g) where+ inEdges = lift . inEdges+ inDegree = lift . inDegree+ incidentEdges = lift . incidentEdges+ degree = lift . degree++instance BidirectionalGraph g => BidirectionalGraph (IdentityT g) where+ inEdges = lift . inEdges+ inDegree = lift . inDegree+ incidentEdges = lift . incidentEdges+ degree = lift . degree++instance BidirectionalGraph g => BidirectionalGraph (MaybeT g) where+ inEdges = lift . inEdges+ inDegree = lift . inDegree+ incidentEdges = lift . incidentEdges+ degree = lift . degree++instance (BidirectionalGraph g, Error e) => BidirectionalGraph (ErrorT e g) where+ inEdges = lift . inEdges+ inDegree = lift . inDegree+ incidentEdges = lift . incidentEdges+ degree = lift . degree++instance BidirectionalGraph Identity where+ inEdges _ = Identity []+ inDegree _ = Identity 0+ incidentEdges _ = Identity []+ degree _ = Identity 0+
Data/Graph/Class/EdgeEnumerable.hs view
@@ -20,7 +20,14 @@ import qualified Control.Monad.Trans.State.Lazy as Lazy import qualified Control.Monad.Trans.Writer.Strict as Strict import qualified Control.Monad.Trans.Writer.Lazy as Lazy+import qualified Control.Monad.Trans.RWS.Strict as Strict+import qualified Control.Monad.Trans.RWS.Lazy as Lazy+import Control.Monad.Trans.Reader+import Control.Monad.Trans.Identity+import Control.Monad.Trans.Maybe+import Control.Monad.Trans.Error import Control.Monad.Trans.Class+import Data.Functor.Identity import Data.Monoid import Data.Graph.Class @@ -39,3 +46,24 @@ instance (EdgeEnumerableGraph g, Monoid m) => EdgeEnumerableGraph (Lazy.WriterT m g) where edges = lift edges++instance (EdgeEnumerableGraph g, Monoid m) => EdgeEnumerableGraph (Strict.RWST r m s g) where+ edges = lift edges++instance (EdgeEnumerableGraph g, Monoid m) => EdgeEnumerableGraph (Lazy.RWST r m s g) where+ edges = lift edges++instance EdgeEnumerableGraph g => EdgeEnumerableGraph (MaybeT g) where+ edges = lift edges++instance EdgeEnumerableGraph g => EdgeEnumerableGraph (IdentityT g) where+ edges = lift edges++instance (EdgeEnumerableGraph g, Error e) => EdgeEnumerableGraph (ErrorT e g) where+ edges = lift edges++instance EdgeEnumerableGraph g => EdgeEnumerableGraph (ReaderT e g) where+ edges = lift edges++instance EdgeEnumerableGraph Identity where+ edges = Identity []
Data/Graph/Class/VertexEnumerable.hs view
@@ -20,9 +20,16 @@ import qualified Control.Monad.Trans.State.Lazy as Lazy import qualified Control.Monad.Trans.Writer.Strict as Strict import qualified Control.Monad.Trans.Writer.Lazy as Lazy+import qualified Control.Monad.Trans.RWS.Strict as Strict+import qualified Control.Monad.Trans.RWS.Lazy as Lazy+import Control.Monad.Trans.Identity+import Control.Monad.Trans.Maybe+import Control.Monad.Trans.Error import Control.Monad.Trans.Class+import Control.Monad.Trans.Reader import Data.Monoid import Data.Graph.Class+import Data.Functor.Identity class Graph g => VertexEnumerableGraph g where -- | /O(v)/@@ -40,3 +47,23 @@ instance (VertexEnumerableGraph g, Monoid m) => VertexEnumerableGraph (Lazy.WriterT m g) where vertices = lift vertices +instance (VertexEnumerableGraph g, Monoid m) => VertexEnumerableGraph (Strict.RWST r m s g) where+ vertices = lift vertices+ +instance (VertexEnumerableGraph g, Monoid m) => VertexEnumerableGraph (Lazy.RWST r m s g) where+ vertices = lift vertices++instance VertexEnumerableGraph g => VertexEnumerableGraph (MaybeT g) where+ vertices = lift vertices++instance VertexEnumerableGraph g => VertexEnumerableGraph (IdentityT g) where+ vertices = lift vertices++instance (VertexEnumerableGraph g, Error e) => VertexEnumerableGraph (ErrorT e g) where+ vertices = lift vertices++instance VertexEnumerableGraph g => VertexEnumerableGraph (ReaderT m g) where+ vertices = lift vertices++instance VertexEnumerableGraph Identity where+ vertices = Identity []
− Data/Graph/Empty.hs
@@ -1,73 +0,0 @@-{-# LANGUAGE TypeFamilies #-}--------------------------------------------------------------------------------- |--- Module : Data.Graph.Empty--- Copyright : (C) 2011 Edward Kmett--- License : BSD-style (see the file LICENSE)------ Maintainer : Edward Kmett <ekmett@gmail.com>--- Stability : experimental--- Portability : type families----------------------------------------------------------------------------------module Data.Graph.Empty- ( Empty(..)- ) where--import Control.Applicative-import Control.Monad-import Data.Void-import Data.Graph.PropertyMap-import Data.Graph.Class.AdjacencyList-import Data.Graph.Class.AdjacencyMatrix-import Data.Graph.Class.VertexEnumerable-import Data.Graph.Class.EdgeEnumerable-import Data.Graph.Class.Bidirectional--newtype Empty a = Empty { runEmpty :: a }--instance Functor Empty where- fmap f (Empty g) = Empty $ f g- b <$ _ = Empty b--instance Applicative Empty where- pure = Empty - Empty f <*> Empty a = Empty (f a)- a <* _ = a- _ *> b = b--instance Monad Empty where- return = Empty- Empty g >>= k = k g- _ >> b = b--voidMap :: PropertyMap Empty Void a-voidMap = PropertyMap (Empty . void) $ \_ _ -> Empty voidMap--instance Graph Empty where- type Vertex Empty = Void- type Edge Empty = Void- vertexMap _ = Empty voidMap - edgeMap _ = Empty voidMap--instance AdjacencyMatrixGraph Empty where- edge _ _ = Empty Nothing--instance AdjacencyListGraph Empty where- source = Empty- target = Empty- outEdges _ = Empty []- outDegree _ = Empty 0--instance BidirectionalGraph Empty where- inEdges _ = Empty []- inDegree _ = Empty 0- incidentEdges _ = Empty []- degree _ = Empty 0--instance EdgeEnumerableGraph Empty where- edges = return []--instance VertexEnumerableGraph Empty where- vertices = return []
graphs.cabal view
@@ -1,6 +1,6 @@ name: graphs category: Data Structures-version: 0.1+version: 0.2 license: BSD3 cabal-version: >= 1.6 license-file: LICENSE@@ -38,7 +38,6 @@ Data.Graph.Class.Bidirectional Data.Graph.Class.VertexEnumerable Data.Graph.Dual- Data.Graph.Empty Data.Graph.PropertyMap other-modules Data.Graph.Internal.Color