module Dodge.Graph where import Data.Function (on) import Data.List import Data.Graph pairsToIncidence :: (Eq a,Ord a) => [(a,a)] -> [(a,[a])] pairsToIncidence = map ((\(xs,ys) -> (head xs,ys)) . unzip) . groupBy ( (==) `on` fst) . sort incidenceToFunction :: Eq a => [(a,[a])] -> a -> [a] incidenceToFunction xs a = case lookup a xs of Just ys -> ys Nothing -> [] mkNode :: (a,[a]) -> (a,a,[a]) mkNode (x,xs) = (x,x,xs) pairsToSCC :: (Eq a, Ord a) => [(a,a)] -> [SCC a] pairsToSCC = stronglyConnComp . map mkNode . pairsToIncidence