depends-0.0.1: src/Run.hs
module Run (run) where
import Control.Applicative
import Data.List
import Data.Char
import Data.Ord
import Data.Map (Map)
import qualified Data.Map as Map
import Control.Monad.Trans.State
import Control.Monad.IO.Class
import Config
import GhcPkg
import qualified Cabal
type Cache = Map Package [Package]
run :: IO ()
run = do
(name, mainDeps, testDeps) <- load "dependencies.yaml"
mainPackages <- mapM latest mainDeps
testPackages <- mapM latest testDeps
m <- execStateT (mapM_ transitiveDependencies mainPackages) Map.empty
t <- execStateT (mapM_ transitiveDependencies testPackages) m
writeFile (name ++ ".cabal") (Cabal.format name (keys m) (keys t))
where
keys = sortByPackageName . Map.keys
sortByPackageName :: [Package] -> [Package]
sortByPackageName = sortBy (comparing (map toLower . packageName))
transitiveDependencies :: Package -> StateT Cache IO [Package]
transitiveDependencies p = do
c <- get
case Map.lookup p c of
Just xs -> return xs
Nothing -> do
xs <- liftIO (dependencies p)
ys <- concat <$> mapM transitiveDependencies xs
let r = p : xs ++ ys
modify (Map.insert p r)
return r