neuron-0.4.0.0: src/lib/Data/Graph/Labelled/Build.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Data.Graph.Labelled.Build where
import qualified Algebra.Graph.Labelled.AdjacencyMap as LAM
import Data.Graph.Labelled.Type (LabelledGraph (LabelledGraph), Vertex (..))
import qualified Data.Map.Strict as Map
import Relude
-- Build a graph from a list objects that contains information about the
-- corresponding vertex as well as the outgoing edges.
mkGraphFrom ::
forall e v.
(Eq e, Monoid e, Ord (VertexID v), Vertex v) =>
-- | List of known vertices in the graph.
[v] ->
[(e, v, v)] ->
LabelledGraph v e
mkGraphFrom xs es =
let vertexList = vertexID <$> xs
vertexMap = Map.fromList $ fmap (vertexID &&& id) xs
edges = flip fmap es $ \(e, v1, v2) -> (e, vertexID v1, vertexID v2)
graph =
LAM.overlay
(LAM.vertices vertexList)
(LAM.edges edges)
in LabelledGraph graph vertexMap