Skip to content

Commit

Permalink
melhor documentação TAD Clientes
Browse files Browse the repository at this point in the history
  • Loading branch information
Matheus de Souza Pessanha committed Mar 23, 2021
1 parent 127291f commit 877fa0f
Showing 1 changed file with 49 additions and 39 deletions.
88 changes: 49 additions & 39 deletions src/LE1/Exercicio4.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down

0 comments on commit 877fa0f

Please sign in to comment.