Copyright(c) Fabricio Olivetti de Franca 2020
LicenseGPL-3
Maintainerfabricio.olivetti@gmail.com
Stabilityexperimental
PortabilityPOSIX
Safe HaskellSafe

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

Documentation

data Checkers Source #

Uma peça de dama pode ser Preta (P), Branca (B), ou Vazia (V) ou Proibido (F) [proibido acrescenta depois]

Constructors

B 
P 
V 
F 

Instances

Instances details
Eq Checkers Source # 
Instance details

Defined in Main

Methods

(==) :: Checkers -> Checkers -> Bool

(/=) :: Checkers -> Checkers -> Bool

Show Checkers Source #

Instância de Show para o tipo Checkers

Instance details

Defined in Main

Methods

showsPrec :: Int -> Checkers -> ShowS

show :: Checkers -> String

showList :: [Checkers] -> ShowS

data Board a Source #

Estrutura de Zipper de lista

Constructors

Board 

Fields

  • foco :: (Int, Int)
     
  • board :: Array (Int, Int) a
     

Instances

Instances details
Eq a => Eq (Board a) Source # 
Instance details

Defined in Main

Methods

(==) :: Board a -> Board a -> Bool

(/=) :: Board a -> Board a -> Bool

Show a => Show (Board a) Source #

Instância de Show para um tabuleiro. Vamos assumir que sempre será 8x8.

Instance details

Defined in Main

Methods

showsPrec :: Int -> Board a -> ShowS

show :: Board a -> String

showList :: [Board a] -> ShowS

type CoordFun = (Int, Int) -> (Int, Int) Source #

Função que atualiza uma coordenada

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

valor :: Board a -> a Source #

Recupera o valor do Zipper

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

paraCima :: Board a -> Maybe (Board a) Source #

Funções para caminhar em todas as direções

paraBaixo :: Board a -> Maybe (Board a) Source #

Funções para caminhar em todas as direções

rebobina :: Board a -> Board a Source #

volta para o início da linha atual

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.

move :: Checkers -> Board Checkers -> Board Checkers Source #

aplica um movimento

alternaVez :: Checkers -> Board Checkers -> [Board Checkers] Source #

cria uma lista infinita de movimentos alternados

main :: IO () Source #