module BishBosh.Component.QualifiedMove(
QualifiedMoveSequence,
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 = MkQualifiedMove {
QualifiedMove -> Move
getMove :: Component.Move.Move,
QualifiedMove -> MoveType
getMoveType :: Attribute.MoveType.MoveType
} deriving QualifiedMove -> QualifiedMove -> Bool
(QualifiedMove -> QualifiedMove -> Bool)
-> (QualifiedMove -> QualifiedMove -> Bool) -> Eq QualifiedMove
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: QualifiedMove -> QualifiedMove -> Bool
$c/= :: QualifiedMove -> QualifiedMove -> Bool
== :: QualifiedMove -> QualifiedMove -> Bool
$c== :: QualifiedMove -> QualifiedMove -> Bool
Eq
instance Show QualifiedMove where
showsPrec :: Int -> QualifiedMove -> ShowS
showsPrec Int
precedence MkQualifiedMove {
getMove :: QualifiedMove -> Move
getMove = Move
move,
getMoveType :: QualifiedMove -> MoveType
getMoveType = MoveType
moveType
} = Int -> (Move, MoveType) -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
precedence (Move
move, MoveType
moveType)
instance Read QualifiedMove where
readsPrec :: Int -> ReadS QualifiedMove
readsPrec Int
precedence = (((Move, MoveType), String) -> (QualifiedMove, String))
-> [((Move, MoveType), String)] -> [(QualifiedMove, String)]
forall a b. (a -> b) -> [a] -> [b]
map (((Move, MoveType) -> QualifiedMove)
-> ((Move, MoveType), String) -> (QualifiedMove, String)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
Control.Arrow.first (((Move, MoveType) -> QualifiedMove)
-> ((Move, MoveType), String) -> (QualifiedMove, String))
-> ((Move, MoveType) -> QualifiedMove)
-> ((Move, MoveType), String)
-> (QualifiedMove, String)
forall a b. (a -> b) -> a -> b
$ (Move -> MoveType -> QualifiedMove)
-> (Move, MoveType) -> QualifiedMove
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Move -> MoveType -> QualifiedMove
MkQualifiedMove) ([((Move, MoveType), String)] -> [(QualifiedMove, String)])
-> (String -> [((Move, MoveType), String)]) -> ReadS QualifiedMove
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> [((Move, MoveType), String)]
forall a. Read a => Int -> ReadS a
readsPrec Int
precedence
instance Control.DeepSeq.NFData QualifiedMove where
rnf :: QualifiedMove -> ()
rnf MkQualifiedMove {
getMove :: QualifiedMove -> Move
getMove = Move
move,
getMoveType :: QualifiedMove -> MoveType
getMoveType = MoveType
moveType
} = (Move, MoveType) -> ()
forall a. NFData a => a -> ()
Control.DeepSeq.rnf (Move
move, MoveType
moveType)
instance Property.Reflectable.ReflectableOnX QualifiedMove where
reflectOnX :: QualifiedMove -> QualifiedMove
reflectOnX qualifiedMove :: QualifiedMove
qualifiedMove@MkQualifiedMove { getMove :: QualifiedMove -> Move
getMove = Move
move } = QualifiedMove
qualifiedMove { getMove :: Move
getMove = Move -> Move
forall a. ReflectableOnX a => a -> a
Property.Reflectable.reflectOnX Move
move }
mkQualifiedMove :: Component.Move.Move -> Attribute.MoveType.MoveType -> QualifiedMove
mkQualifiedMove :: Move -> MoveType -> QualifiedMove
mkQualifiedMove = Move -> MoveType -> QualifiedMove
MkQualifiedMove
type QualifiedMoveSequence = [QualifiedMove]