Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Main where
- import Options.Applicative
- import Data.Semigroup ((<>))
- import System.IO
- import Control.Monad
- import System.Environment (getArgs)
- import Prelude
- import System.Directory
- data Sample = Sample
- { lines :: Bool
- , bytes :: Bool
- , chars :: Bool
- , words :: Bool
- , file :: String }
- data Input
- = FileInput FilePath
- | StdInput
- sample :: Parser Sample
- sample = Sample
- <$> switch
- ( long "lines"
- <> short 'l'
- <> help "Number of lines" )
- <*> switch
- ( long "bytes"
- <> short 'b'
- <> help "Number of bytes" )
- <*> switch
- ( long "chars"
- <> short 'c'
- <> help "Number of chars" )
- <*> switch
- ( long "words"
- <> short 'w'
- <> help "Number of words" )
- <*> argument str (metavar "FILE"
- <> value "")
- main :: IO ()
- main = do
- greet =<< execParser opts
- where
- opts = info (sample <**> helper)
- ( fullDesc
- <> progDesc "Print information about FILE" )
- greet :: Sample -> IO ()
- greet (Sample False False False False "") = getStdin [True, True, True, True]
- greet (Sample a b c d "") = getStdin [a, b, c, d]
- greet (Sample False False False False f) = getFile ([True, True, True, True], f)
- greet (Sample a b c d f) = getFile ([a, b, c, d], f)
- greet _ = return ()
- getFile :: ([Bool], String) -> IO ()
- getFile ([a, b, c, d], file) = do
- if a then (lineNumber file) else (putStr "")
- if b then (wordsNumber file) else (putStr "")
- if c then (charsNumber file) else (putStr "")
- if d then (bytesNumber file) else (putStr "")
- putStrLn ""
- getStdin :: [Bool] -> IO ()
- getStdin [a, b, c, d] = do
- text <- hGetContents stdin
- if a then (lineNumber1 text) else (putStr "")
- if b then (wordsNumber1 text) else (putStr "")
- if c then (charsNumber1 text) else (putStr "")
- if d then (bytesNumber1 text) else (putStr "")
- putStrLn ""
- lineNumber :: String -> IO ()
- lineNumber file = do
- text <- readFile file
- putStr (show (length (Prelude.lines text)))
- putStr " "
- wordsNumber :: String -> IO()
- wordsNumber file = do
- text <- readFile file
- putStr (show (length (Prelude.words text)))
- putStr " "
- charsNumber :: String -> IO()
- charsNumber file = do
- text <- readFile file
- putStr (show ((length text) - (length (Prelude.lines text)) + 1))
- putStr " "
- bytesNumber :: String -> IO()
- bytesNumber file = do
- x <- getFileSize file
- print x
- lineNumber1 :: String -> IO ()
- lineNumber1 text = do
- putStr (show (length (Prelude.lines text)))
- putStr " "
- wordsNumber1 :: String -> IO()
- wordsNumber1 text = do
- putStr (show (length (Prelude.words text)))
- putStr " "
- charsNumber1 :: String -> IO()
- charsNumber1 text = do
- putStr (show ((length text) - (length (Prelude.lines text)) + 1))
- putStr " "
- bytesNumber1 :: String -> IO()
- bytesNumber1 text = do
- putStr (show (length text))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement