{-# LANGUAGE DeriveDataTypeable #-} import Data.Data import Data.Generics (listify) import Data.List (nub, sortBy) import Data.Maybe data File = File String [Either File Module] deriving (Data, Typeable, Eq, Ord, Show) data Module = Module String Component deriving (Data, Typeable, Eq, Ord, Show) data Component = Component [File] [Module] deriving (Data, Typeable, Eq, Ord, Show) f0 = File "f0" [] f1 = File "f1" [] f2 = File "f2" [Left f1] f3 = File "f3" [Left f4, Left f5] f4 = File "f4" [] f5 = File "f5" [] f6 = File "f6" [Right m3, Right m2] f7 = File "f7" [Right m1, Left f0] m1 = Module "m1" $ Component [f6] [m2, m3] m2 = Module "m2" $ Component [f1, f2] [] m3 = Module "m3" $ Component [f3, f4, f5] [] testC = Component [f0, f7] [m1, m2, m3] files :: [File] files = nub $ listify (const True) testC filesDeps :: [(String,[String])] filesDeps = map (\(File n deps) -> (n, nub $ map fn $ listify (const True) deps)) files where fn (File n _) = n compareDeps :: (String, [String]) -> (String, [String]) -> Ordering compareDeps (fa, da) (fb, db) | fa `elem` db && fb `elem` da = error "cycle" | fa `elem` db = LT | otherwise = GT sortedDeps = sortBy compareDeps filesDeps
*Main> mapM_ print sortedDeps ("f1",[]) ("f2",["f1"]) ("f5",[]) ("f4",[]) ("f3",["f4","f5"]) ("f6",["f3","f4","f5","f1","f2"]) ("f0",[]) ("f7",["f6","f3","f4","f5","f1","f2","f0"])
[ Home | Post Entry | Log in | Search | Browse Options | Site Map ]
no subject
Выхлоп: Похоже на правду.