Copyright | (c) Fabricio Olivetti de Franca 2020 |
---|---|
License | GPL-3 |
Maintainer | fabricio.olivetti@gmail.com |
Stability | experimental |
Portability | POSIX |
Safe Haskell | Safe |
Main
Description
Código de exemplo do uso de Zippers para percorrer uma estrutura 2D. O intuito desse código é ilustrar como a estrutura de Zippers combinada com uma função de visão local facilita a criação de funções auxiliares.
Synopsis
- data Checkers
- data Board a = Board {}
- type CoordFun = (Int, Int) -> (Int, Int)
- type Movimento = [((Int, Int), Checkers)]
- initialBoard :: Board Checkers
- within :: Ord a => (a, a) -> ((a, a), (a, a)) -> Bool
- valor :: Board a -> a
- para :: CoordFun -> Board a -> Maybe (Board a)
- paraDireita :: Board a -> Maybe (Board a)
- paraEsquerda :: Board a -> Maybe (Board a)
- paraCima :: Board a -> Maybe (Board a)
- paraBaixo :: Board a -> Maybe (Board a)
- rebobina :: Board a -> Board a
- proximo :: Board a -> Maybe (Board a)
- vizinhanca :: Board Checkers -> [[Checkers]]
- possivelMover :: Checkers -> [[Checkers]] -> Movimento
- possivelAtacar :: Checkers -> [[Checkers]] -> Movimento
- paraComeco :: Board a -> Board a
- ataques :: Checkers -> Board Checkers -> Board Movimento
- movimentos :: Checkers -> Board Checkers -> Board Movimento
- aplica :: (Board a -> b) -> Board a -> Board b
- escolha :: Board Movimento -> Movimento
- move :: Checkers -> Board Checkers -> Board Checkers
- alternaVez :: Checkers -> Board Checkers -> [Board Checkers]
- main :: IO ()
Documentation
Uma peça de dama pode ser Preta (P), Branca (B), ou Vazia (V) ou Proibido (F) [proibido acrescenta depois]
Instances
Estrutura de Zipper de lista
type Movimento = [((Int, Int), Checkers)] Source #
Lista de movimentos que devem ser feitos para atualizar o tabuleiro.
Conversões
initialBoard :: Board Checkers Source #
Tabuleiro inicial
Como caminhar pelo Zipper
within :: Ord a => (a, a) -> ((a, a), (a, a)) -> Bool Source #
Verifica se coordenada está dentro do limite
para :: CoordFun -> Board a -> Maybe (Board a) Source #
Atualiza a coordenada segundo uma função e retorna o novo tabuleiro se a coordenada estiver dentro dos limites.
paraDireita :: Board a -> Maybe (Board a) Source #
Funções para caminhar em todas as direções
paraEsquerda :: Board a -> Maybe (Board a) Source #
Funções para caminhar em todas as direções
proximo :: Board a -> Maybe (Board a) Source #
caminha para a próxima casa, seguindo pela ordem de linhas.
vizinhanca :: Board Checkers -> [[Checkers]] Source #
recupera uma vizinhança 3x3 em torno da posição atual.
possivelMover :: Checkers -> [[Checkers]] -> Movimento Source #
verifica se é possível fazer um movimento. Originalmente essa função retornava verdadeiro e falso porém percebemos que precisamos devolver a lista de atualizações do tabuleiro. Uma lista vazia representa impossibilidade em fazer tal movimento.
possivelAtacar :: Checkers -> [[Checkers]] -> Movimento Source #
similar ao possivelMover
porém verifica possíveis ataques.
paraComeco :: Board a -> Board a Source #
volta o foco para a primeira casa do tabuleiro
aplica :: (Board a -> b) -> Board a -> Board b Source #
co-co-co-co-co-comonads!!! Dada uma função que retorna um valor de um tipo b em um certo foco do tabuleiro, aplica em todos os possíveis focos.
escolha :: Board Movimento -> Movimento Source #
Dado um tabuleiro de possíveis movimentos, escolhe o primeiro possível. dando preferência para ataques.