module Data.Graph.Internal where
import Data.Hashable
import qualified Data.HashMap.Lazy as HM
import Data.Graph.Types
-- | Each vertex maps to a 'Links' value so it can poit to other vertices
type Links v e = HM.HashMap v e
-- | Insert a link directed to *v* with attribute *a*
-- | If the connnection already exists, the attribute is replaced
insertLink :: (Hashable v, Eq v) => v -> a -> Links v a -> Links v a
insertLink = HM.insert
-- | Get the links for a given vertex
getLinks :: (Hashable v, Eq v) => v -> HM.HashMap v (Links v e) -> Links v e
getLinks = HM.lookupDefault HM.empty
-- | Get 'Arc's from an association list of vertices and their links
linksToArcs :: [(v, Links v a)] -> [Arc v a]
linksToArcs = concatMap toArc
where
toArc :: (v, Links v a) -> [Arc v a]
toArc (fromV, links) = fmap (uncurry (Arc fromV)) (HM.toList links)
-- | Get 'Edge's from an association list of vertices and their links
linksToEdges :: [(v, Links v a)] -> [Edge v a]
linksToEdges = concatMap toEdge
where
toEdge :: (v, Links v a) -> [Edge v a]
toEdge (fromV, links) = fmap (uncurry (Edge fromV)) (HM.toList links)
-- | O(log n) Associate the specified value with the specified key in this map.
-- | If this map previously contained a mapping for the key, leave the map
-- | intact.
hashMapInsert :: (Eq k, Hashable k) => k -> v -> HM.HashMap k v -> HM.HashMap k v
hashMapInsert k v m = if not (HM.member k m) then HM.insert k v m else m