diff -r 8867bc102f05 -r 935de6cd5ea3 tools/unitCycles.hs --- a/tools/unitCycles.hs Thu Nov 18 17:00:45 2010 +0300 +++ b/tools/unitCycles.hs Thu Nov 18 17:01:35 2010 +0300 @@ -6,6 +6,7 @@ import Data.Either import Data.List import Data.Graph +import Data.Maybe unident :: Identificator -> String unident (Identificator s) = s @@ -20,7 +21,26 @@ showSCC (AcyclicSCC v) = v showSCC (CyclicSCC vs) = intercalate ", " vs +myf :: [(String, [String])] -> String +myf d = unlines . map (findCycle . fst) $ d + where + findCycle :: String -> String + findCycle searched = intercalate ", " $ fc searched [searched] + where + fc :: String -> [String] -> [String] + fc curSearch visited = let uses = curSearch `lookup` d in if isNothing uses then [] else concatMap t $ fromJust uses + where + t u = + if u == searched then + [u] + else + if u `elem` visited then + [] + else + let chain = fc u (u:visited) in if null chain then [] else u:chain + + main = do fileNames <- getArgs files <- mapM readFile fileNames - putStrLn . f . map extractUnits . rights . map parsePascalUnit $ files + putStrLn . myf . map extractUnits . rights . map parsePascalUnit $ files