{-# LANGUAGE MultiParamTypeClasses #-}
module BishBosh.StateProperty.Mutator(
Mutator(..),
placePiece,
placeFirstPiece,
placeAllPieces,
removePiece
) where
import qualified BishBosh.Cartesian.Coordinates as Cartesian.Coordinates
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
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