import Data.List.Split (sepBy) import Control.Applicative ((<$>), (<*>)) import Data.List (isInfixOf) import Distribution.InstalledPackageInfo (InstalledPackageInfo, InstalledPackageInfo_(..), parseInstalledPackageInfo, ParseResult(..)) import Distribution.Package (PackageIdentifier) import Distribution.Text (display) import System.Environment (getArgs) display' :: PackageIdentifier -> String display' = show . display fromParseOk :: Show a => ParseResult a -> a fromParseOk (ParseOk _ x) = x fromParseOk e = error $ "Parse failed: " ++ show e rels :: InstalledPackageInfo -> [String] rels = fmap . (. display') . (++) . (++ " -> ") . display' . package <*> depends fmain :: [String] -> String -> String fmain maintainers input = unlines $ "digraph Packages {" : deps ++ ["}"] where deps :: [String] deps = (filteredRels . fromParseOk . parseInstalledPackageInfo) =<< sepBy "\n---\n" input filteredRels :: InstalledPackageInfo -> [String] filteredRels ipi | any (`isInfixOf` maintainer ipi) maintainers = ('\t' :) <$> rels ipi | otherwise = [] main :: IO () main = do maintainers <- getArgs interact $ fmain maintainers