September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
|
|
@ -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_
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue