-- |
-- Module : Main
-- Copyright : (c) Joachim Fasting 2008-2010
-- License : BSD3 (see COPYING)
-- Maintainer : joachim.fasting@gmail.com
-- Stability : unstable
-- Portability : unportable
--
-- Compilation: ghc -O2 --make Main.hs -o nsort
--
-- Usage: nsort [FILE]...
--
-- Write a sorted concatenation of all FILE(s) to standard output.
--
-- If no files are given, read from standard input.
module Main (main) where
import NaturalSort (natSort)
import Data.ByteString.Char8 (ByteString)
import qualified Data.ByteString.Char8 as B
import System.Console.GetOpt
import System.Environment (getArgs)
import System.Exit
data Flag = Help | Version deriving Eq
options :: [OptDescr Flag]
options = [Option "" ["help"] (NoArg Help) "Show program help"
,Option "" ["version"] (NoArg Version) "Show program version"
]
usage, version :: String
usage = usageInfo ("Usage: nsort [OPTION]... [FILE]...\n"
++ "Write sorted concatenation of all FILE(s) to stdout.\n")
options
++ "\nWith no FILE read standard input.\n"
version = "nsort 0.2.1"
parseArgv :: [String] -> IO [String]
parseArgv argv =
case getOpt Permute options argv of
(flags, args, []) | Help `elem` flags -> putStr usage >>
exitWith ExitSuccess
| Version `elem` flags -> putStrLn version >>
exitWith ExitSuccess
| otherwise -> return args
(_, _, errs) -> fail (head errs)
-- Read input from a list of files, or from standard input.
inp :: [FilePath] -> IO ByteString
inp [] = B.getContents
inp xs = B.concat `fmap` mapM B.readFile xs
-- | Main.
main :: IO ()
main = getArgs >>= parseArgv >>= inp >>= B.putStr . B.unlines . natSort
. B.lines