module Tarefa3 where
import Data.Either
import Labs2025
type Dano = Int
type Danos = [(Posicao,Dano)]
avancaEstado :: Estado -> Estado
avancaEstado :: Estado -> Estado
avancaEstado e :: Estado
e@(Estado Mapa
mapa [Objeto]
objetos [Minhoca]
minhocas) = (Danos -> Estado -> Estado) -> Estado -> [Danos] -> Estado
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Danos -> Estado -> Estado
aplicaDanos Estado
e' [Danos]
danoss
where
minhocas' :: [Minhoca]
minhocas' = ((NumMinhoca, Minhoca) -> Minhoca)
-> [(NumMinhoca, Minhoca)] -> [Minhoca]
forall a b. (a -> b) -> [a] -> [b]
map ((NumMinhoca -> Minhoca -> Minhoca)
-> (NumMinhoca, Minhoca) -> Minhoca
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((NumMinhoca -> Minhoca -> Minhoca)
-> (NumMinhoca, Minhoca) -> Minhoca)
-> (NumMinhoca -> Minhoca -> Minhoca)
-> (NumMinhoca, Minhoca)
-> Minhoca
forall a b. (a -> b) -> a -> b
$ Estado -> NumMinhoca -> Minhoca -> Minhoca
avancaMinhoca Estado
e) ([NumMinhoca] -> [Minhoca] -> [(NumMinhoca, Minhoca)]
forall a b. [a] -> [b] -> [(a, b)]
zip [NumMinhoca
0..] [Minhoca]
minhocas)
([Objeto]
objetos',[Danos]
danoss) = [Either Objeto Danos] -> ([Objeto], [Danos])
forall a b. [Either a b] -> ([a], [b])
partitionEithers ([Either Objeto Danos] -> ([Objeto], [Danos]))
-> [Either Objeto Danos] -> ([Objeto], [Danos])
forall a b. (a -> b) -> a -> b
$ ((NumMinhoca, Objeto) -> Either Objeto Danos)
-> [(NumMinhoca, Objeto)] -> [Either Objeto Danos]
forall a b. (a -> b) -> [a] -> [b]
map ((NumMinhoca -> Objeto -> Either Objeto Danos)
-> (NumMinhoca, Objeto) -> Either Objeto Danos
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((NumMinhoca -> Objeto -> Either Objeto Danos)
-> (NumMinhoca, Objeto) -> Either Objeto Danos)
-> (NumMinhoca -> Objeto -> Either Objeto Danos)
-> (NumMinhoca, Objeto)
-> Either Objeto Danos
forall a b. (a -> b) -> a -> b
$ Estado -> NumMinhoca -> Objeto -> Either Objeto Danos
avancaObjeto Estado
e) ([NumMinhoca] -> [Objeto] -> [(NumMinhoca, Objeto)]
forall a b. [a] -> [b] -> [(a, b)]
zip [NumMinhoca
0..] [Objeto]
objetos)
e' :: Estado
e' = Mapa -> [Objeto] -> [Minhoca] -> Estado
Estado Mapa
mapa [Objeto]
objetos' [Minhoca]
minhocas'
avancaMinhoca :: Estado -> NumMinhoca -> Minhoca -> Minhoca
avancaMinhoca :: Estado -> NumMinhoca -> Minhoca -> Minhoca
avancaMinhoca Estado
e NumMinhoca
i Minhoca
m = Minhoca
forall a. HasCallStack => a
undefined
avancaObjeto :: Estado -> NumObjeto -> Objeto -> Either Objeto Danos
avancaObjeto :: Estado -> NumMinhoca -> Objeto -> Either Objeto Danos
avancaObjeto Estado
e NumMinhoca
i Objeto
o = Either Objeto Danos
forall a. HasCallStack => a
undefined
aplicaDanos :: Danos -> Estado -> Estado
aplicaDanos :: Danos -> Estado -> Estado
aplicaDanos Danos
ds Estado
e = Estado
forall a. HasCallStack => a
undefined