mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-08 07:09:28 +03:00
50 lines
1.4 KiB
Haskell
50 lines
1.4 KiB
Haskell
#!/usr/bin/env runhaskell
|
|
{-
|
|
overview.hs - print an overview of functions from a given list of modules
|
|
|
|
Usage: ./overview.hs somefile
|
|
|
|
where somefile, typically your main module, contains the word "overview"
|
|
followed by a blank-line-delimited list of module names, like so:
|
|
|
|
firstmodule
|
|
anothermodule
|
|
submodule
|
|
|
|
Useful for getting the big picture and refactoring.
|
|
-}
|
|
|
|
import System
|
|
import System.Process
|
|
import IO
|
|
import Data.List
|
|
import Text.Printf
|
|
|
|
main = do
|
|
args <- getArgs
|
|
file <- readFile $ head args
|
|
let mods = takeWhile ((> 0) . length) $
|
|
dropWhile ((== 0) . length) $
|
|
dropWhile ((> 0) . length) $
|
|
dropWhile (notElem "overview" . words) $
|
|
lines file
|
|
putStr $ unlines mods
|
|
let files = concat $ map ((++ ".hs ") . dropWhile (== ' ')) mods
|
|
let grep = "grep -H '^\\w[^=]*::' " ++ files
|
|
(inp, out, err, pid) <- runInteractiveCommand grep
|
|
waitForProcess pid
|
|
grepoutput <- hGetContents out
|
|
let groups = groupBy (\a b -> samefile a b) $ lines grepoutput
|
|
sequence $ map printgroup groups
|
|
putStr "\n"
|
|
|
|
printgroup ls = do putStr "\n"; sequence $ map printline ls
|
|
|
|
printline l =
|
|
putStrLn $ printf "%-22s %-40s %s" (file++":") code typedecl
|
|
where
|
|
(file, rest) = break (== ':') l
|
|
(code, typedecl) = break (== ':') $ tail rest
|
|
|
|
samefile a b = ((takeWhile (/= ':') a) ++ ":") `isPrefixOf` b
|