module Data.Text.WordCount.Exec where
import Data.Maybe
import Data.Monoid
import qualified Data.Text.IO as TLIO
import Data.Text.WordCount
import Data.Text.WordCount.FileRead
import Data.Version
import Options.Applicative
import Paths_wordchoice
data Program = Program { file :: FilePath
, num :: Maybe Int
, output :: Maybe FilePath
, filterOutput :: Bool }
program :: Parser Program
program = Program
<$> (argument str
(metavar "FILEPATH"
<> completer (bashCompleter "file -o plusdirs")
<> help "File to analyze"))
<*> (optional (read <$> strOption
(short 'n'
<> long "number"
<> metavar "NUM"
<> help "Top NUM words will be listed")))
<*> (optional (strOption
(short 'o'
<> long "output"
<> metavar "OUTPUT"
<> help "Filepath for output graph")))
<*> switch
(short 'f'
<> long "filter"
<> help "Filter common English words from output.")
versionInfo :: Parser (a -> a)
versionInfo = infoOption
("wordchoice version: " ++ showVersion version)
(short 'v' <> long "version" <> help "Show version")
wrapper :: ParserInfo Program
wrapper = info (helper <*> versionInfo <*> program)
(fullDesc
<> progDesc "Word choice is a command-line meant to help you improve your writing. Simply point it to a file containing text and it will list your most frequently used words and their frequencies."
<> header "Word choice command-line utility")
exec :: IO ()
exec = execParser wrapper >>= pick
pick :: Program -> IO ()
pick rec = let n = fromMaybe 25 (num rec) in do
contents <- globFile (file rec)
let pick = if not (filterOutput rec) then topN n else filterTop n small
TLIO.putStrLn . displayWords . pick $ contents
case output rec of
(Just out) -> flip makeFile out . topN n $ contents
_ -> pure ()