{- pureGraphMakeConsistent removes parent links to non-existent nodes from
   the graph.

   This deals with a situation which can sometimes occur when versions are
   being rewired.
   -}
module Graphs.PureGraphMakeConsistent(
   pureGraphMakeConsistent,
   ) where

import qualified Data.Map as Map

import Graphs.PureGraph

pureGraphMakeConsistent :: Ord nodeInfo
   => PureGraph nodeInfo arcInfo -> PureGraph nodeInfo arcInfo
pureGraphMakeConsistent :: PureGraph nodeInfo arcInfo -> PureGraph nodeInfo arcInfo
pureGraphMakeConsistent (PureGraph {nodeDataFM :: forall nodeInfo arcInfo.
PureGraph nodeInfo arcInfo
-> Map nodeInfo (NodeData nodeInfo arcInfo)
nodeDataFM = Map nodeInfo (NodeData nodeInfo arcInfo)
nodeDataFM0}) =
   let
      nodeDataFM1 :: Map nodeInfo (NodeData nodeInfo arcInfo)
nodeDataFM1 = (nodeInfo
 -> NodeData nodeInfo arcInfo -> NodeData nodeInfo arcInfo)
-> Map nodeInfo (NodeData nodeInfo arcInfo)
-> Map nodeInfo (NodeData nodeInfo arcInfo)
forall k a b. (k -> a -> b) -> Map k a -> Map k b
Map.mapWithKey
         (\ nodeInfo
_ NodeData nodeInfo arcInfo
nodeData0 ->
            let
               parents0 :: [ArcData nodeInfo arcInfo]
parents0 = NodeData nodeInfo arcInfo -> [ArcData nodeInfo arcInfo]
forall nodeInfo arcInfo.
NodeData nodeInfo arcInfo -> [ArcData nodeInfo arcInfo]
parents NodeData nodeInfo arcInfo
nodeData0
               parents1 :: [ArcData nodeInfo arcInfo]
parents1 = (ArcData nodeInfo arcInfo -> Bool)
-> [ArcData nodeInfo arcInfo] -> [ArcData nodeInfo arcInfo]
forall a. (a -> Bool) -> [a] -> [a]
filter
                  (\ ArcData nodeInfo arcInfo
arcData -> nodeInfo -> Map nodeInfo (NodeData nodeInfo arcInfo) -> Bool
forall k a. Ord k => k -> Map k a -> Bool
Map.member (ArcData nodeInfo arcInfo -> nodeInfo
forall nodeInfo arcInfo. ArcData nodeInfo arcInfo -> nodeInfo
target ArcData nodeInfo arcInfo
arcData) Map nodeInfo (NodeData nodeInfo arcInfo)
nodeDataFM0)
                  [ArcData nodeInfo arcInfo]
parents0

               nodeData1 :: NodeData nodeInfo arcInfo
nodeData1 = NodeData :: forall nodeInfo arcInfo.
[ArcData nodeInfo arcInfo] -> NodeData nodeInfo arcInfo
NodeData {parents :: [ArcData nodeInfo arcInfo]
parents = [ArcData nodeInfo arcInfo]
parents1}
            in
               NodeData nodeInfo arcInfo
nodeData1
            )
         Map nodeInfo (NodeData nodeInfo arcInfo)
nodeDataFM0
   in
      PureGraph :: forall nodeInfo arcInfo.
Map nodeInfo (NodeData nodeInfo arcInfo)
-> PureGraph nodeInfo arcInfo
PureGraph {nodeDataFM :: Map nodeInfo (NodeData nodeInfo arcInfo)
nodeDataFM = Map nodeInfo (NodeData nodeInfo arcInfo)
nodeDataFM1}