1-----------------------------------------------------------------------------
3-- Module : Language.PureScript.ModuleDependencies
4-- Copyright : (c) Phil Freeman 2013
7-- Maintainer : Phil Freeman <paf31@cantab.net>
8-- Stability : experimental
11-- | Provides the ability to sort modules based on module dependencies
13-----------------------------------------------------------------------------
15module Language.PureScript.ModuleDependencies (
22import Data.Maybe (mapMaybe)
24import Language.PureScript.AST
25import Language.PureScript.Names
26import Language.PureScript.Types
29-- A list of modules with their dependencies
31type ModuleGraph = [(ModuleName, [ModuleName])]
34-- Sort a collection of modules based on module dependencies.
36-- Reports an error if the module graph contains a cycle.
38sortModules :: [Module] -> Either String ([Module], ModuleGraph)
40 let verts = map (\m@(Module _ ds _) -> (m, getModuleName m, nub (concatMap usedModules ds))) ms
41 ms' <- mapM toModule $ stronglyConnComp verts
42 let moduleGraph = map (\(_, mn, deps) -> (mn, deps)) verts
43 return (ms', moduleGraph)
46-- Calculate a list of used modules based on explicit imports and qualified names
48usedModules :: Declaration -> [ModuleName]
49usedModules = let (f, _, _, _, _) = everythingOnValues (++) forDecls forValues (const []) (const []) (const []) in nub . f
51 forDecls :: Declaration -> [ModuleName]
52 forDecls (ImportDeclaration mn _ _) = [mn]
55 forValues :: Expr -> [ModuleName]
56 forValues (Var (Qualified (Just mn) _)) = [mn]
57 forValues (Constructor (Qualified (Just mn) _)) = [mn]
58 forValues (TypedValue _ _ ty) = forTypes ty
61 forTypes :: Type -> [ModuleName]
62 forTypes (TypeConstructor (Qualified (Just mn) _)) = [mn]
63 forTypes (ConstrainedType cs _) = mapMaybe (\(Qualified mn _, _) -> mn) cs
67-- Convert a strongly connected component of the module graph to a module
69toModule :: SCC Module -> Either String Module
70toModule (AcyclicSCC m) = return m
71toModule (CyclicSCC [m]) = return m
72toModule (CyclicSCC ms) = Left $ "Cycle in module dependencies: " ++ show (map getModuleName ms)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list