Advertisement
Guest User

Untitled

a guest
Jun 2nd, 2017
559
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -----------------------------------------------------------------------------
  2. --
  3. -- Module      :  Main
  4. -- Copyright   :
  5. -- License     :  AllRightsReserved
  6. --
  7. -- Maintainer  :  José Hugo Elsas
  8. -- Stability   :  Unstable
  9. -- Portability :
  10. --
  11. -- |
  12. --
  13. -----------------------------------------------------------------------------
  14.  
  15. module Main (
  16. ) where
  17.  
  18. import IO
  19.  
  20. -------------------------------------------------------------------------
  21. {-Definicao dos tipos basicos-}
  22.  
  23. data Nome = Nome {preNome :: String, sobreNome :: String} deriving (Eq,Show,Read)
  24.  
  25. data TipoEmail = EmailPessoal | EmailTrabalho | EmailComercial deriving (Eq,Show,Read)
  26. data Email = Email {servicoEmail :: String,
  27.                     emailEmail :: String,
  28.                     tipoEmail :: TipoEmail} deriving (Eq,Show,Read)
  29.  
  30. data TipoTelefone = TeleResidencial | TeleTrabalho | TeleCelular deriving (Eq,Show,Read)
  31. data Telefone = Telefone{ ddiTelefone :: Maybe String,
  32.                           dddTelefone :: Maybe String,
  33.                           numeroTelefone :: String,
  34.                           tipoTelefone :: TipoTelefone} deriving (Eq,Show,Read)
  35.  
  36. data Endereco = Endereco { cidadeEndereco      :: String,
  37.                            bairroEndereco      :: String,
  38.                            ruaEndereco         :: String,
  39.                            numeroEndereco      :: String,
  40.                            apartamentoEndereco :: Maybe String,
  41.                            complementoEndereco :: Maybe String } deriving (Eq,Show,Read)
  42.  
  43. data Contato = Contato { nomeContato       :: Nome,
  44.                          telefoneContato   :: [Telefone],
  45.                          enderecoContato   :: Endereco,
  46.                          emailContato      :: [Email],
  47.                          mensageiroContato :: [Email]} deriving (Eq,Show,Read)
  48.  
  49. class Pretty a where
  50.     pretty :: a →  String
  51.  
  52. prettyNome  (Nome p s)  = p++" "++s
  53.  
  54. prettyEmail (Email s e _) = e++"("++s++")"
  55.  
  56. prettyTelefone (Telefone Nothing Nothing t _) = (take 4 t)++"-"++(drop 4 t)
  57. prettyTelefone (Telefone Nothing (Just d) t _) = "("++d++") "++(take 4 t)++"-"++(drop 4 t)
  58. prettyTelefone (Telefone (Just i) Nothing t _) = "("++i++") "++(take 4 t)++"-"++(drop 4 t)
  59. prettyTelefone (Telefone (Just i) (Just d) t _) = "("++i++"-"++d++") "++(take 4 t)++"-"++(drop 4 t)
  60.  
  61. prettyEndereco (Endereco ci ba ru nu ap co) = "Rua "++ru++", #"++nu⊕(l ap co ba ci)
  62.                                                 where
  63.                                                     l (Just a) (Just b) c d = ", "++b++" apto "++a++", "++c++"-"++d
  64.                                                     l Nothing (Just b) c d = ", "++b++", "++c++"-"++d
  65.                                                     l (Just a) Nothing c d = " apto "++a++", "++c++"-"++d
  66.                                                     l Nothing Nothing c d = ", "++c++"-"++d
  67.  
  68. prettyContato (Contato no te en em me) = "Nome: "++(pretty no)++"\n"++
  69.                                          tels++
  70.                                          "Endereço: "++(pretty en)++"\n"++
  71.                                          ems++
  72.                                          mes
  73.                                             where
  74.                                                 tels = concat ["Telefone "++(show i)++" ("++(drop 4 $ show $ tipoTelefone $ t)++")"++": "++(pretty t)++"\n"|(i,t) ←  zip [1..] te]
  75.                                                 ems = concat ["Email "++(show i)++" ("++(drop 5 $ show $ tipoEmail $ e)++")"++": "++(pretty e)++"\n"|(i,e) ←  zip [1..] em]
  76.                                                 mes = concat ["Mensageiro "++(show i)++" ("++(drop 5 $ show $ tipoEmail $ m)++")"++": "++(pretty m)++"\n"|(i,m) ←  zip [1..] me]
  77.  
  78.  
  79. instance Pretty Nome where
  80.     pretty = prettyNome
  81.  
  82. instance Pretty Email where
  83.     pretty = prettyEmail
  84.  
  85. instance Pretty Telefone where
  86.     pretty = prettyTelefone
  87.  
  88. instance Pretty Endereco where
  89.     pretty = prettyEndereco
  90.  
  91. instance Pretty Contato where
  92.     pretty = prettyContato
  93.  
  94. ------------------------------------------------------------------------
  95.  
  96. {- Parte de IO -}
  97.  
  98. loadContatos :: Handle →  IO (Maybe [Contato])
  99. loadContatos inh = do x ←  hGetContents inh
  100.                       return (Just (map read (lines x))) :: IO (Maybe [Contato])
  101.  
  102. getNomeIO :: IO Nome
  103. getNomeIO = do putStrLn "Digite o 1o ome do novo contato"
  104.                prenome ←  getLine
  105.                putStrLn "Digite o sobrenome do novo contato"
  106.                sobrenome ←  getLine
  107.                return (Nome prenome sobrenome)
  108.  
  109. ---------------------------------------------
  110.  
  111. getTelefoneLoopIO :: [Telefone] →  IO [Telefone]
  112. getTelefoneLoopIO listaTel = do putStrLn "Deseja adicionar um telefone? Se sim digite (s) se não digite (n)"
  113.                                 c ←  getLine
  114.                                 if(c=="n") then (return listaTel)
  115.                                            else do putStrLn "Digite o número do novo telefone a ser posto na agenda"
  116.                                                    tel ←  getLine
  117.                                                    putStrLn "Digite se o número é residencial(r), de trabalho(t) ou celular(c)"
  118.                                                    c ←  getLine
  119.                                                    putStrLn "Digite o DDD do contato. Se não quiser nenhum, simplesmente clique ENTER"
  120.                                                    ddd ←  getLine
  121.                                                    putStrLn "Digite o DDI do contato. Se não quiser nenhum, simplesmente clique ENTER"
  122.                                                    ddi ←  getLine
  123.                                                    let tipoTel = if(c=="r") then TeleResidencial else if (c=="t") then TeleTrabalho else TeleCelular
  124.                                                    let dddTel  = if(ddd=="") then Nothing else (Just ddd)
  125.                                                    let ddiTel  = if(ddi=="") then Nothing else (Just ddi)
  126.                                                    getTelefoneLoopIO (listaTel⊕[(Telefone ddiTel dddTel tel tipoTel)])
  127.  
  128. getTelefoneIO = getTelefoneLoopIO []
  129.  
  130. -------------------------------------------------------
  131.  
  132. getEmailLoopIO :: [Email] →  IO [Email]
  133. getEmailLoopIO listaEmail = do putStrLn "Deseja adicionar um e-mail? Se sim digite (s) se não digite (n)"
  134.                                c ←  getLine
  135.                                if(c=="n") then (return listaEmail)
  136.                                           else do putStrLn "Digite o novo e-mail a ser posto na agenda"
  137.                                                   email ←  getLine
  138.                                                   putStrLn "Digite se o e-mail é Pessoal(p), de Trabalho(t) ou Comercial(c)"
  139.                                                   c ←  getLine
  140.                                                   putStrLn "Digite o Serviço do seu e-mail(e.g. gmail,hotmail,...)."
  141.                                                   serv ←  getLine
  142.                                                   let tipoEmail = if(c=="p") then EmailPessoal else if (c=="t") then EmailTrabalho else EmailComercial
  143.                                                   getEmailLoopIO (listaEmail⊕[(Email serv email tipoEmail)])
  144.  
  145. getEmailIO = getEmailLoopIO []
  146.  
  147. -------------------------------------
  148.  
  149. {-getEndereco-}
  150.  
  151. ------------------------------------------------------------------------
  152.  
  153. testeEndereco1 = Endereco "Rio de Janeiro" "Botafogo" "Voluntários da Pátria" "374" (Just "202") Nothing
  154. testeEmail11 = Email "gmail" "euclydesgaspar@gmail.com" EmailPessoal
  155. testeEmail12 = Email "yahoo" "gasparelsas@yahoo.com.br" EmailPessoal
  156. testeNome1 = Nome "Euclydes" "Duarte Gaspar"
  157. testeTelefone11 = Telefone (Just "55") (Just "21") "25398374" TeleResidencial
  158. testeTelefone12 = Telefone (Just "55") (Just "21") "25355537" TeleResidencial
  159. testeTelefone13 = Telefone (Just "55") (Just "21") "97054096" TeleCelular
  160. testeContato1 = Contato testeNome1 [testeTelefone11,testeTelefone12,testeTelefone13] testeEndereco1 [testeEmail11,testeEmail12] []
  161.  
  162. testeEndereco2 = Endereco "Rio de Janeiro" "Botafogo" "Voluntários da Pátria" "374" (Just "802") Nothing
  163. testeEmail21 = Email "hotmail" "raquel-capella@hotmail.com" EmailPessoal
  164. testeEmail22 = Email "yahoo" "raquel.capella@yahoo.com.br" EmailPessoal
  165. testeMens12 = testeEmail21
  166. testeMens22 = Email "skype" "raquel" EmailPessoal
  167. testeNome2 = Nome "Raquel" "Capella Gaspar Nepomuceno"
  168. testeTelefone21 = Telefone (Just "55") (Just "21") "25262343" TeleResidencial
  169. testeTelefone22 = Telefone (Just "55") (Just "21") "98580665" TeleCelular
  170. testeContato2 = Contato testeNome2 [testeTelefone21,testeTelefone22] testeEndereco2 [testeEmail21,testeEmail22] [testeMens12,testeMens22]
  171.  
  172. main = do x ←  getTelefoneIO
  173.           mapM_ putStrLn (map pretty x)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement