module Exercise_7 where import Data.List (groupBy, find, nubBy, sortBy) import Data.Ord (comparing) import Data.Function (on) {-WETT-} trancl :: Eq a => [(Integer,(a,a))] -> [(Integer,(a,a))] trancl xs = nubBy (on (==) snd) . sortBy (comparing fst) $ concatMap (trace 0 [] . snd . snd) xs where trace w visited cur = [(w, (cur, last visited)) | length visited /= 0] ++ concat [trace (w' + w) (cur : visited) a | (w', (a, b)) <- xs, cur == b && b `notElem` visited] {-TTEW-}