{-# LANGUAGE MultiParamTypeClasses #-}
module BishBosh.StateProperty.Mutator(
Mutator(..),
placePiece,
placeFirstPiece,
placeAllPieces,
removePiece
) where
import qualified BishBosh.Attribute.MoveType as Attribute.MoveType
import qualified BishBosh.Cartesian.Coordinates as Cartesian.Coordinates
import qualified BishBosh.Component.Move as Component.Move
import qualified BishBosh.Component.Piece as Component.Piece
import qualified BishBosh.Property.Empty as Property.Empty
class Mutator mutator where
defineCoordinates
:: Maybe Component.Piece.Piece
-> Cartesian.Coordinates.Coordinates
-> mutator
-> mutator
movePiece
:: Component.Move.Move
-> Attribute.MoveType.MoveType
-> Component.Piece.Piece
-> mutator
-> mutator
placePiece
:: Mutator mutator
=> Component.Piece.Piece
-> Cartesian.Coordinates.Coordinates
-> mutator
-> mutator
placePiece :: Piece -> Coordinates -> mutator -> mutator
placePiece Piece
piece = Maybe Piece -> Coordinates -> mutator -> mutator
forall mutator.
Mutator mutator =>
Maybe Piece -> Coordinates -> mutator -> mutator
defineCoordinates (Maybe Piece -> Coordinates -> mutator -> mutator)
-> Maybe Piece -> Coordinates -> mutator -> mutator
forall a b. (a -> b) -> a -> b
$ Piece -> Maybe Piece
forall a. a -> Maybe a
Just Piece
piece
placeFirstPiece :: (
Property.Empty.Empty mutator,
Mutator mutator
)
=> Component.Piece.Piece
-> Cartesian.Coordinates.Coordinates
-> mutator
placeFirstPiece :: Piece -> Coordinates -> mutator
placeFirstPiece Piece
piece Coordinates
coordinates = Piece -> Coordinates -> mutator -> mutator
forall mutator.
Mutator mutator =>
Piece -> Coordinates -> mutator -> mutator
placePiece Piece
piece Coordinates
coordinates mutator
forall a. Empty a => a
Property.Empty.empty
placeAllPieces :: (
Property.Empty.Empty mutator,
Mutator mutator
)
=> [(Component.Piece.Piece, Cartesian.Coordinates.Coordinates)]
-> mutator
placeAllPieces :: [(Piece, Coordinates)] -> mutator
placeAllPieces = ((Piece, Coordinates) -> mutator -> mutator)
-> mutator -> [(Piece, Coordinates)] -> mutator
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ((Piece -> Coordinates -> mutator -> mutator)
-> (Piece, Coordinates) -> mutator -> mutator
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Piece -> Coordinates -> mutator -> mutator
forall mutator.
Mutator mutator =>
Piece -> Coordinates -> mutator -> mutator
placePiece) mutator
forall a. Empty a => a
Property.Empty.empty
removePiece
:: Mutator mutator
=> Cartesian.Coordinates.Coordinates
-> mutator
-> mutator
removePiece :: Coordinates -> mutator -> mutator
removePiece = Maybe Piece -> Coordinates -> mutator -> mutator
forall mutator.
Mutator mutator =>
Maybe Piece -> Coordinates -> mutator -> mutator
defineCoordinates Maybe Piece
forall a. Maybe a
Nothing