graphs-0.1: Data/Graph/Empty.hs
{-# 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 []