{- | A command-line program that uses "Data.Random.Choose". Its arguments are specified by "Data.Random.Choose.Executable.Args". -} module Data.Random.Choose.Executable ( main ) where -------------------------------------------------------------------------------- import qualified Data.Random.Choose.Executable.Args as Args import Data.Random.Choose.IO (getSelectionsIO) import qualified Data.Text.IO as TextIO import Control.Exception.Base (try) import Control.Monad (when) import Data.Text (Text) import System.IO (stdin) import System.IO.Error (isEOFError) -------------------------------------------------------------------------------- main :: IO () -- ^ The entry point for an executable that reads lines from stdin and outputs -- some fixed number of them, selected uniformly at random. readLine :: IO (Maybe Text) -- ^ Produces 'Just' a line of text, or 'Nothing' if the stream has ended. -------------------------------------------------------------------------------- main = do args <- Args.getArgs let n = Args.getN args when (n > 0) $ do selections <- getSelectionsIO readLine n mapM_ TextIO.putStrLn selections readLine = do lineEither <- try $ TextIO.hGetLine stdin case lineEither of Left e -> if isEOFError e then return Nothing else ioError e Right line -> return $ Just line