Just another update
This commit is contained in:
parent
a25938f123
commit
00a190b0a6
6591 changed files with 94363 additions and 23227 deletions
49
Task/Mad-Libs/Haskell/mad-libs.hs
Normal file
49
Task/Mad-Libs/Haskell/mad-libs.hs
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
import System.IO
|
||||
import System.Environment
|
||||
import qualified Data.Map as M
|
||||
|
||||
getLines :: IO [String]
|
||||
getLines = getLines' [] >>= return . reverse
|
||||
where
|
||||
getLines' xs = do
|
||||
line <- getLine
|
||||
case line of
|
||||
[] -> return xs
|
||||
_ -> getLines' $ line:xs
|
||||
|
||||
prompt :: String -> IO String
|
||||
prompt p = putStr p >> hFlush stdout >> getLine
|
||||
|
||||
getKeyword :: String -> Maybe String
|
||||
getKeyword ('<':xs) = getKeyword' xs []
|
||||
where
|
||||
getKeyword' [] _ = Nothing
|
||||
getKeyword' (x:'>':_) acc = Just $ '<' : (reverse $ '>':x:acc)
|
||||
getKeyword' (x:xs) acc = getKeyword' xs $ x:acc
|
||||
getKeyword _ = Nothing
|
||||
|
||||
parseText :: String -> M.Map String String -> IO String
|
||||
parseText [] _ = return []
|
||||
parseText line@(l:lx) keywords = do
|
||||
case getKeyword line of
|
||||
Nothing -> parseText lx keywords >>= return . (l:)
|
||||
Just keyword -> do
|
||||
let rest = drop (length keyword) line
|
||||
case M.lookup keyword keywords of
|
||||
Nothing -> do
|
||||
newword <- prompt $ "Enter a word for " ++ keyword ++ ": "
|
||||
rest' <- parseText rest $ M.insert keyword newword keywords
|
||||
return $ newword ++ rest'
|
||||
Just knownword -> do
|
||||
rest' <- parseText rest keywords
|
||||
return $ knownword ++ rest'
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
args <- getArgs
|
||||
nlines <- case args of
|
||||
[] -> getLines >>= return . unlines
|
||||
arg:_ -> readFile arg
|
||||
nlines' <- parseText nlines M.empty
|
||||
putStrLn ""
|
||||
putStrLn nlines'
|
||||
Loading…
Add table
Add a link
Reference in a new issue