module Autoexporter (main) where import qualified Data.List as List import qualified Data.Maybe as Maybe import qualified Distribution.ModuleName as ModuleName import qualified Distribution.Text as Text import qualified System.Directory as Directory import qualified System.Environment as Environment import qualified System.FilePath as FilePath main :: IO () main = do args <- Environment.getArgs case args of [name, inputFile, outputFile] -> do let moduleName = makeModuleName name let directory = FilePath.dropExtension inputFile files <- Directory.getDirectoryContents directory let haskellFiles = filter (\ f -> List.isSuffixOf ".hs" f || List.isSuffixOf ".lhs" f) files let paths = map (directory FilePath.) haskellFiles let modules = List.sort (map makeModuleName paths) let exports = init (unlines (map (\ x -> " module " ++ x ++ ",") modules)) let imports = init (unlines (map ("import " ++) modules)) let output = unlines [ unwords ["module", moduleName, "("] , exports , ") where" , "" , imports ] writeFile outputFile output _ -> error ("unexpected arguments: " ++ show args) makeModuleName :: FilePath -> String makeModuleName name = let path = FilePath.dropExtension name parts = FilePath.splitDirectories path rest = reverse (takeWhile (\ x -> Maybe.isJust (Text.simpleParse x :: Maybe ModuleName.ModuleName)) (reverse parts)) in List.intercalate "." rest