New version of cycles searcher, doesn't work for some reason (shouldn't use O(n) lookup?)
authorunC0Rr
Thu, 18 Nov 2010 17:01:35 +0300
changeset 4382 935de6cd5ea3
parent 4381 8867bc102f05
child 4383 0a7158f26ffa
New version of cycles searcher, doesn't work for some reason (shouldn't use O(n) lookup?)
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