diff --git a/src/LE1/Exercicio4.hs b/src/LE1/Exercicio4.hs index 4f9efa7..9530603 100644 --- a/src/LE1/Exercicio4.hs +++ b/src/LE1/Exercicio4.hs @@ -18,7 +18,17 @@ import Data.Decimal (Decimal) import System.PosixCompat.Files (getFileStatus, isDirectory) import qualified Data.ByteString.Char8 as B --- | Contrato de implementação +-- | Implementação + +{- | Um TAD Cliente possui 3 construtores: + + 1 - Vazio + 2 - Invalido + 3 - Cliente com seus campos, onde + valor = Decimal + cod = Integer + textos = ByteString, representação + de cada byte em um Array de um conteúdo -} data Cliente = Invalido | Vazio | Cliente { codigo :: Integer , nome :: B.ByteString , endereco :: B.ByteString @@ -57,10 +67,10 @@ toList (Cliente c n e t dt_p dt_u v_u) = list list = [c', n', e', t', dt_p', dt_u', v_u'] -{- Dado os seguintes parâmetros, em ordem: - código, nome, endereço, telefone, - data primeira compra, data última compra - e valor da última compra, retorno um Cliente -} +{- | Dado os seguintes parâmetros, em ordem: + código, nome, endereço, telefone, + data primeira compra, data última compra + e valor da última compra, retorno um Cliente -} criaCliente :: (Integer, String, String, String, String, String, Decimal) -> Cliente criaCliente (c, n, e, t, dt_p, dt_u, v_u) = Cliente c n' e' t' dt_p' dt_u' v_u where n' = B.pack n @@ -69,19 +79,19 @@ criaCliente (c, n, e, t, dt_p, dt_u, v_u) = Cliente c n' e' t' dt_p' dt_u' v_u dt_p' = B.pack dt_p dt_u' = B.pack dt_u -{- Dado uma lista de Clientes (resultado de carregaClientes) - Devolvo apenas 1 cliente na dada posição. +{- | Dado uma lista de Clientes (resultado de carregaClientes) + Devolvo apenas 1 cliente na dada posição. - O operador (!!) em Haskell não é seguro, portanto, - para minimizar seu efeito, realizo uma simples conta - onde se o índice dado for negativo, converto o índice - para ser acessível no lista, tendo: + O operador (!!) em Haskell não é seguro, portanto, + para minimizar seu efeito, realizo uma simples conta + onde se o índice dado for negativo, converto o índice + para ser acessível no lista, tendo: - Tendo índice == x, - Se x < 0 -> troco o sinal e retorno o cliente na - posição (-x) - Se x > tamnho lista -> retorno o Cliente na - posição do resto do índice pelo tamanho da lista -} + Tendo índice == x, + Se x < 0 -> troco o sinal e retorno o cliente na + posição (-x) + Se x > tamnho lista -> retorno o Cliente na + posição do resto do índice pelo tamanho da lista -} getCliente :: IO Clientes -> Int -> IO Cliente getCliente c_io idx = do num <- numClientes c_io @@ -90,9 +100,9 @@ getCliente c_io idx = do then return $ c !! (mod (negate idx) num) else return $ c !! idx -{- Dado um caminho de um arquivo, - leio o conteúdo desse arquivo - e devolvo uma lista de Clientes -} +{- | Dado um caminho de um arquivo, + leio o conteúdo desse arquivo + e devolvo uma lista de Clientes -} carregaClientes :: FilePath -> IO Clientes carregaClientes path = do conteudo <- leArquivo path @@ -102,29 +112,29 @@ carregaClientes path = do clientes' <- return $ filter (/= Invalido) (map (leCliente) conteudo) return clientes' -{- Dado um Cliente e um caminho, adiciono esse - Cliente no arquivo, acrescentando caso o - arquivo já exista -} +{- | Dado um Cliente e um caminho, adiciono esse + Cliente no arquivo, acrescentando caso o + arquivo já exista -} salvaCliente :: Cliente -> FilePath -> IO () salvaCliente c path = do nl <- return $ B.pack "\n" conteudo <- return $ B.concat (nl:(converteCliente c):[]) B.appendFile path conteudo -{- Dada uma lista de Clientes salvo um - Cliente por vez, um por linha -} +{- | Dada uma lista de Clientes salvo um + Cliente por vez, um por linha -} salvaClientes :: Clientes -> FilePath -> IO () salvaClientes [] _ = putStrLn "Lista vazia" salvaClientes xs path = mapM_ (\x -> salvaCliente x path) xs >> putStrLn "Os Clientes foram salvos!" -{- Dada uma IO lista de Clientes, um índice e um caminho, - removo dessa lista o Cliente do índice específicado - (levando em conta a função getCliente), e crio um novo - arquivo com a nova lista! +{- | Dada uma IO lista de Clientes, um índice e um caminho, + removo dessa lista o Cliente do índice específicado + (levando em conta a função getCliente), e crio um novo + arquivo com a nova lista! - Para ter o efeito de atualizar um arquivo já existe, - forneça como parâmetro um arquivo já existe, pois essa - função irá sobrescrevê-lo -} + Para ter o efeito de atualizar um arquivo já existe, + forneça como parâmetro um arquivo já existe, pois essa + função irá sobrescrevê-lo -} excluirCliente :: IO Clientes -> Int -> FilePath -> IO Cliente excluirCliente cs idx path = do cs' <- cs @@ -135,12 +145,12 @@ excluirCliente cs idx path = do _ <- B.writeFile path conteudo return cl --- Funções de ajuda (funções privadas) +-- Funções de ajuda numClientes :: IO Clientes -> IO Int numClientes xs = return . length . filter (/= Invalido) =<< xs -{- Converto um TAD Cliente para uma representação binária -} +{- | Converto um TAD Cliente para uma representação binária -} converteCliente :: Cliente -> B.ByteString converteCliente Invalido = B.pack "" converteCliente Vazio = B.intercalate (B.pack ",") cliente @@ -152,8 +162,8 @@ converteCliente (Cliente c n t e dt_p dt_u v_u) = cliente' cliente = cod:n:t:e:dt_p:dt_u:va:[] cliente' = B.intercalate (B.pack ",") cliente -{- Transformo uma lista de ByTeString (dados crus do Cliente) - em um TAD Cliente válido -} +{- | Transformo uma lista de ByTeString (dados crus do Cliente) + em um TAD Cliente válido -} leCliente :: [B.ByteString] -> Cliente leCliente (x:_) | x == B.empty = Invalido @@ -163,10 +173,10 @@ leCliente (c:n:t:e:dt_p:dt_u:v_u:_) = Cliente cod n e t dt_p dt_u va_u leCliente _ = Invalido -{- Dado um caminho para um arquivo, leio o conteúdo - dele, separo por linhas e depois divido cada linha - em um elemento a partir do caractere ",", retornando - uma 2d-lista de ByteString -} +{- |Dado um caminho para um arquivo, leio o conteúdo + dele, separo por linhas e depois divido cada linha + em um elemento a partir do caractere ",", retornando + uma 2d-lista de ByteString -} leArquivo :: FilePath -> IO [[B.ByteString]] leArquivo caminho = do status <- getFileStatus caminho