module Pangraph.Containers
    ( convert
    ) where
import Pangraph
import qualified Data.Graph as CGraph
import Data.Maybe       (fromMaybe)
import Data.List        (groupBy, sort)
import Control.Arrow    ((***))
import Data.Map.Strict  (Map)
import qualified Data.Map.Strict as Map
convert :: Pangraph -> (CGraph.Graph, CGraph.Vertex -> (Vertex, VertexID, [VertexID]), VertexID -> Maybe CGraph.Vertex)
convert p = CGraph.graphFromEdges getVertices
  where
    
    edgeEndpointIDs :: Edge -> (VertexID, VertexID)
    edgeEndpointIDs e = (vertexID *** vertexID) $ edgeEndpoints e
    
    edgeMap :: Map VertexID [VertexID]
    edgeMap = (Map.fromList . groupIDs) $ map edgeEndpointIDs $ edgeList p
    
    vertexConnections :: Vertex -> [VertexID]
    vertexConnections v = fromMaybe [] (Map.lookup (vertexID v) edgeMap)
    
    getVertices :: [(Vertex, VertexID, [VertexID])]
    getVertices = map (\v ->(v, vertexID v, vertexConnections v)) $ vertexList p
groupIDs :: [(VertexID, VertexID)] -> [(VertexID, [VertexID])]
groupIDs vs = map (\ts -> (fst $ head ts, map snd ts)) groupedEdges
  where
    groupedEdges :: [[(VertexID, VertexID)]]
    groupedEdges = groupBy (\a b -> fst a == fst b) $ sort vs