September 2017 Update

This commit is contained in:
Ingy döt Net 2017-09-23 10:01:46 +02:00
parent bba7bfd280
commit ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions

View file

@ -1,49 +1,52 @@
import System.IO
import System.Environment
import qualified Data.Map as M
import System.IO (stdout, hFlush)
import System.Environment (getArgs)
import qualified Data.Map as M (Map, lookup, insert, empty)
getLines :: IO [String]
getLines = getLines' [] >>= return . reverse
where
getLines' xs = do
line <- getLine
case line of
[] -> return xs
_ -> getLines' $ line:xs
getLines = reverse <$> getLines_ []
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
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
parseText [] _ = return []
parseText line@(l:lx) keywords =
case getKeyword line of
Nothing -> parseText lx keywords >>= return . (l:)
Nothing -> (l :) <$> parseText lx keywords
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'
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'
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
args <- getArgs
nlines <-
case args of
[] -> unlines <$> getLines
arg:_ -> readFile arg
nlines_ <- parseText nlines M.empty
putStrLn ""
putStrLn nlines'
putStrLn nlines_