Quick actions

cmd+k|ctrl+k

Navigation

Languages

🧙 It's dangerous to go alone! Take this. 🧪

Snippet info

Language

Haskell

Visibility

public

Author

francesquini

Created

2024-09-05T19:25:33.864776Z

Updated

2024-09-05T19:30:39.602587Z

-- 05/09/2024 Matheus Fernandes e Emilio Francesquini
-- Universidade Federal do ABC

-- Enunciado completo em: 
-- https://haskell.pesquisa.ufabc.edu.br/12-programação-funcional-2024-files/lista05.pdf

module Exercicios where

import           Control.Monad.State
import           Data.Maybe          (isJust)

data Produto =
  Produto
    { nome  :: String
    , preco :: Int
    }
  deriving (Show, Eq)

data Loja =
  Loja
    { caixa   :: Int
    , estoque :: [Produto]
    }
  deriving (Show, Eq)

vender :: String -> Int -> State Loja Int
vender nomeProduto valor = state realizaVenda
  where
    realizaVenda :: Loja -> (Int, Loja)
    realizaVenda lj
      | valor <= caixa lj =
        ( valor
        , Loja (caixa lj - valor) ((Produto nomeProduto valor) : estoque lj))
      | otherwise = (0, lj)

comprar :: String -> State Loja (Maybe Produto)
comprar nomeProduto = state realizaCompra
  where
    realizaCompra :: Loja -> (Maybe Produto, Loja)
    realizaCompra lj =
      case findAndRemoveProduto $ estoque lj of
        Nothing -> (Nothing, lj)
        Just (p, novoEstoque) -> (Just p, Loja novoCaixa novoEstoque)
          where novoCaixa = caixa lj + preco p
    findAndRemoveProduto :: [Produto] -> Maybe (Produto, [Produto])
    findAndRemoveProduto ps = go ps []
      where
        go [] _ = Nothing
        go (x:xs) acc
          | nome x == nomeProduto = Just (x, reverse acc ++ xs)
          | otherwise = go xs (x : acc)

type Cliente = State Loja Bool

vendeEspada :: Cliente
vendeEspada = do
  valorVendido <- vender "Espada" 10
  return $ valorVendido > 0

compraEscudo :: Cliente
compraEscudo = do
  maybeProduto <- comprar "Escudo"
  return $ isJust maybeProduto

-- I'm Commander Shepard, and This Is My Favorite Store on the Citadel
shepard :: Cliente
shepard = do
  valorEspada <- vender "Espada" 10
  valorEscudo <- vender "Escudo" 5
  return $ valorEspada + valorEscudo > 0

-- TODO:
frisk :: Cliente
frisk = undefined

loneWanderer :: Cliente
loneWanderer = undefined

dragonborn :: Cliente
dragonborn = undefined

geralt :: Cliente
geralt = undefined

main :: IO ()
main = do
  print "Welcome Traveler"
INFO