Advertisement
Guest User

Untitled

a guest
May 30th, 2015
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.10 KB | None | 0 0
  1. import Control.Exception.Base
  2.  
  3. printHelp :: IO ()
  4. printHelp = do
  5. putStrLn "0 - exit"
  6. putStrLn "1 name number - add (name,number) record to the phonebook"
  7. putStrLn "2 name - find number via name"
  8. putStrLn "3 number - find name via number"
  9. putStrLn "4 file - save current data to file"
  10. putStrLn "5 file - read data from file"
  11. putStrLn "h - print help"
  12.  
  13. type PhoneBook = [(String, [String])]
  14.  
  15. addRecord :: (String, String) -> PhoneBook -> PhoneBook
  16. addRecord (nm, nb) p = case (lookup nm p) of
  17. Just _ -> map (\(x,y) -> if x == nm then (x, nb:y) else (x,y)) p
  18. Nothing -> (nm, [nb]):p
  19.  
  20. findName :: String -> PhoneBook -> Maybe [String]
  21. findName n l = case res of
  22. [] -> Nothing
  23. _ -> Just (map (fst) res)
  24. where res = filter (\(x,y) -> n `elem` y) l
  25.  
  26. progLoop :: PhoneBook -> IO ()
  27. progLoop pb = do
  28. com <- getLine
  29. case (com !! 0) of
  30. '0' -> return ()
  31. '1' -> case (words $ drop 2 com) of
  32. [name, number] -> do putStrLn "OK";progLoop (addRecord (name, number) pb)
  33. _ -> fail "wrong number of arguments"
  34. '2' -> do case (words $ drop 2 com) of
  35. [name] -> do putStrLn $ show (lookup name pb);putStrLn "OK";progLoop pb
  36. _ -> fail "wrong number of arguments"
  37. '3' -> do case (words $ drop 2 com) of
  38. [number] -> do putStrLn $ show (findName number pb);putStrLn "OK";progLoop pb
  39. _ -> fail "wrong number of arguments"
  40. '4' -> do case (words $ drop 2 com) of
  41. [filename] -> do writeFile filename (show pb);putStrLn "OK";progLoop pb
  42. _ -> fail "wrong number of arguments"
  43. '5' -> do
  44. file <- readFile (drop 2 com)
  45. newpb <- readIO file :: IO PhoneBook
  46. putStrLn "OK"
  47. progLoop newpb
  48. 'h' -> do printHelp; progLoop pb
  49. _ -> fail $ "wrong command: " ++ com
  50. `catch` (\e -> do putStrLn (show (e :: IOError));progLoop pb)
  51.  
  52. main = do printHelp; progLoop []
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement