RosettaCodeData/Task/Mad-Libs/Haskell/mad-libs.hs

53 lines
1.4 KiB
Haskell
Raw Permalink Normal View History

2017-09-23 10:01:46 +02:00
import System.IO (stdout, hFlush)
import System.Environment (getArgs)
import qualified Data.Map as M (Map, lookup, insert, empty)
2015-02-20 00:35:01 -05:00
getLines :: IO [String]
2017-09-23 10:01:46 +02:00
getLines = reverse <$> getLines_ []
where
getLines_ xs = do
line <- getLine
case line of
[] -> return xs
_ -> getLines_ $ line : xs
2015-02-20 00:35:01 -05:00
prompt :: String -> IO String
prompt p = putStr p >> hFlush stdout >> getLine
getKeyword :: String -> Maybe String
2017-09-23 10:01:46 +02:00
getKeyword ('<':xs) = getKeyword_ xs []
where
getKeyword_ [] _ = Nothing
getKeyword_ (x:'>':_) acc = Just $ '<' : reverse ('>' : x : acc)
getKeyword_ (x:xs) acc = getKeyword_ xs $ x : acc
getKeyword _ = Nothing
2015-02-20 00:35:01 -05:00
parseText :: String -> M.Map String String -> IO String
2017-09-23 10:01:46 +02:00
parseText [] _ = return []
parseText line@(l:lx) keywords =
2015-02-20 00:35:01 -05:00
case getKeyword line of
2017-09-23 10:01:46 +02:00
Nothing -> (l :) <$> parseText lx keywords
2015-02-20 00:35:01 -05:00
Just keyword -> do
let rest = drop (length keyword) line
case M.lookup keyword keywords of
2017-09-23 10:01:46 +02:00
Nothing -> do
newword <- prompt $ "Enter a word for " ++ keyword ++ ": "
rest_ <- parseText rest $ M.insert keyword newword keywords
return $ newword ++ rest_
2015-02-20 00:35:01 -05:00
Just knownword -> do
2017-09-23 10:01:46 +02:00
rest_ <- parseText rest keywords
return $ knownword ++ rest_
2015-02-20 00:35:01 -05:00
main :: IO ()
main = do
2017-09-23 10:01:46 +02:00
args <- getArgs
nlines <-
case args of
[] -> unlines <$> getLines
arg:_ -> readFile arg
nlines_ <- parseText nlines M.empty
2015-02-20 00:35:01 -05:00
putStrLn ""
2017-09-23 10:01:46 +02:00
putStrLn nlines_