packages feed

cimple-0.0.2: src/Language/Cimple/Graph.hs

{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData      #-}
module Language.Cimple.Graph
  ( Graph
  , fromEdges
  , edges
  ) where

import qualified Data.Graph as G

data Graph node key = Graph
    { graph          :: G.Graph
    , nodeFromVertex :: G.Vertex -> (node, key, [key])
    , vertexFromKey  :: key -> Maybe G.Vertex
    }

fromEdges :: Ord key => [(node, key, [key])] -> Graph node key
fromEdges es = Graph{..}
  where
    (graph, nodeFromVertex, vertexFromKey) = G.graphFromEdges es

edges :: Graph node key -> [(key, key)]
edges Graph{..} = map resolve . G.edges $ graph
  where
    resolve (from, to) =
      let
          (_, from', _) = nodeFromVertex from
          (_, to', _) = nodeFromVertex to
      in
      (from', to')