23 lines
531 B
Haskell
23 lines
531 B
Haskell
module Dodge.Graph
|
|
where
|
|
import Data.List.Extra
|
|
|
|
import Data.Bifunctor (first)
|
|
import Data.Graph
|
|
import Data.Maybe
|
|
|
|
pairsToIncidence :: (Eq a,Ord a) => [(a,a)] -> [(a,[a])]
|
|
pairsToIncidence
|
|
= map (first head . unzip)
|
|
. groupOn fst
|
|
. sort
|
|
|
|
incidenceToFunction :: Eq a => [(a,[a])] -> a -> [a]
|
|
incidenceToFunction xs a = fromMaybe [] $ lookup a xs
|
|
|
|
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
|