module BishBosh.Component.QualifiedMove(
QualifiedMove(
getMove,
getMoveType
),
mkQualifiedMove
) where
import qualified BishBosh.Attribute.MoveType as Attribute.MoveType
import qualified BishBosh.Component.Move as Component.Move
import qualified BishBosh.Property.Reflectable as Property.Reflectable
import qualified Control.Arrow
import qualified Control.DeepSeq
data QualifiedMove x y = MkQualifiedMove {
getMove :: Component.Move.Move x y,
getMoveType :: Attribute.MoveType.MoveType
} deriving Eq
instance (Show x, Show y) => Show (QualifiedMove x y) where
showsPrec _ MkQualifiedMove {
getMove = move,
getMoveType = moveType
} = shows (move, moveType)
instance (
Enum x,
Enum y,
Ord x,
Ord y,
Read x,
Read y
) => Read (QualifiedMove x y) where
readsPrec _ = map (Control.Arrow.first $ uncurry MkQualifiedMove) . reads
instance (Control.DeepSeq.NFData x, Control.DeepSeq.NFData y) => Control.DeepSeq.NFData (QualifiedMove x y) where
rnf MkQualifiedMove {
getMove = move,
getMoveType = moveType
} = Control.DeepSeq.rnf (move, moveType)
instance Enum y => Property.Reflectable.ReflectableOnX (QualifiedMove x y) where
reflectOnX qualifiedMove@MkQualifiedMove { getMove = move } = qualifiedMove { getMove = Property.Reflectable.reflectOnX move }
mkQualifiedMove :: Component.Move.Move x y -> Attribute.MoveType.MoveType -> QualifiedMove x y
mkQualifiedMove = MkQualifiedMove