packages feed

hid-examples-0.5: ch11/graph-assoc-tf/Main.hs

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}

import Data.List
import Data.Map (Map)
import qualified Data.Map as Map (fromList)

class Graph g where
  type Vertex g -- associated type family
  data Edge g   -- associated data family
  src, tgt :: Edge g -> Vertex g
  outEdges :: g -> Vertex g -> [Edge g]
  -- other methods

neighbours :: Graph g => g -> Vertex g -> [Vertex g]
neighbours g v = map tgt (outEdges g v)

isLoop :: (Graph g, Eq (Vertex g)) => g -> Edge g -> Bool
isLoop g e = src e == tgt e


-- Representation #1: list of edges
newtype EdgesList = EdgesList [Edge EdgesList]

instance Graph EdgesList where
  type Vertex EdgesList = Int
  data Edge EdgesList = MkEdge1 (Vertex EdgesList) (Vertex EdgesList) 
  src = undefined
  tgt = undefined
  outEdges = undefined

g1 :: EdgesList
g1 = EdgesList [MkEdge1 0 1, MkEdge1 1 0]


-- Representation #2: lists of adjacent vertices
newtype VertexMap = VertexMap (Map (Vertex VertexMap) [Vertex VertexMap])

instance Graph VertexMap where
  type Vertex VertexMap = String
  data Edge VertexMap = MkEdge2 Int (Vertex VertexMap)
                             (Vertex VertexMap)
  src = undefined
  tgt = undefined
  outEdges = undefined

g2 :: VertexMap
g2 = VertexMap (Map.fromList [("A", ["B"]), ("B", ["A"])])

main = do
  print $ neighbours g1 0
  print $ isLoop g1 (MkEdge1 0 1)