import Distribution.PackDeps
import System.Environment (getArgs)
import Control.Monad.Trans.RWS
import Control.Monad.IO.Class (liftIO)
import qualified Data.Set as Set
import qualified Data.Map as Map
import Control.Monad (unless)
import System.IO (hPutStrLn, stderr)
import Distribution.Text (display)
import Distribution.Package (Dependency (..), PackageName (..))
data Package = Package
{ name :: String
, version :: String
}
deriving (Eq, Ord)
type M = RWST Newest (Set.Set Package) (Set.Set String) IO
bootlibs :: Set.Set String
bootlibs = Set.fromList $ words
"containers ghc-binary ghc-prim Cabal base old-locale old-time time random syb template-haskell filepath haskell98 unix Win32 bytestring deepseq array network process directory" -- FIXME
main :: IO ()
main = do
toProcess <- getArgs
newest <- loadNewest
((), _, packages) <- runRWST (mapM_ process toProcess) newest bootlibs
mapM_ (\(Package n v) -> putStrLn $ unwords [n, v]) $ Set.toList packages
process :: String -> M ()
process package = do
processed <- get
unless (package `Set.member` processed) $ do
put $ Set.insert package processed
newest <- ask
case Map.lookup package newest of
Nothing -> liftIO $ hPutStrLn stderr $ "Warning: Unknown package: " ++ package
Just (PackInfo version mdi _) -> do
tell $ Set.singleton $ Package package $ display version
case mdi of
Nothing -> liftIO $ hPutStrLn stderr $ "Warning: No information on: " ++ package
Just (DescInfo { diDeps = deps }) ->
mapM_ (\(Dependency (PackageName n) _) -> process n) deps