module Data.Graph.Persistence
( PersistentGraph, persistGraph, loadGraph )
where
import Data.Graph.PureCore
import Data.Graph.NodeManager
import Data.Hashable
import Data.SafeCopy
import qualified Data.IntMap.Strict as IM
import qualified Data.Vector.Unboxed as VU
data PersistentGraph k
= PersistentGraph
{ pg_nodeData :: NodeMap k
, pg_graphData :: [(Node, [Node])]
} deriving (Show, Eq)
persistGraph :: (Eq k, Hashable k) => NodeManager k -> Graph -> PersistentGraph k
persistGraph nodeManager graph =
PersistentGraph
{ pg_nodeData = getNodeMap nodeManager
, pg_graphData = map (\(k, vals) -> (k, VU.toList vals)) (IM.toList $ g_adj graph)
}
loadGraph :: (Eq k, Hashable k) => PersistentGraph k -> (NodeManager k, Graph)
loadGraph (PersistentGraph nodeData graphData) =
(initNodeManager nodeData, fromAdj graphData)
$(deriveSafeCopy 1 'base ''PersistentGraph)
$(deriveSafeCopy 1 'base ''Edge)