module BishBosh.Attribute.Rank(
Promotable(..),
EvaluateRank,
ByRank,
Rank(..),
tag,
flank,
promotionProspects,
defaultPromotionRank,
plodders,
fixedAttackRange,
individuallySufficientMaterial,
pieces,
nobility,
range,
expendable,
nDistinctRanks,
compareByLVA,
listArrayByRank
) where
import qualified Control.DeepSeq
import qualified Control.Exception
import qualified Data.Array.IArray
import qualified Data.Char
import qualified Data.List
import qualified Data.Ord
import qualified Text.XML.HXT.Arrow.Pickle as HXT
import qualified Text.XML.HXT.Arrow.Pickle.Schema
tag :: String
tag :: String
tag = String
"rank"
data Rank
= Pawn
| Rook
| Knight
| Bishop
| Queen
| King
deriving (
Rank
Rank -> Rank -> Bounded Rank
forall a. a -> a -> Bounded a
maxBound :: Rank
$cmaxBound :: Rank
minBound :: Rank
$cminBound :: Rank
Bounded,
Int -> Rank
Rank -> Int
Rank -> [Rank]
Rank -> Rank
Rank -> Rank -> [Rank]
Rank -> Rank -> Rank -> [Rank]
(Rank -> Rank)
-> (Rank -> Rank)
-> (Int -> Rank)
-> (Rank -> Int)
-> (Rank -> [Rank])
-> (Rank -> Rank -> [Rank])
-> (Rank -> Rank -> [Rank])
-> (Rank -> Rank -> Rank -> [Rank])
-> Enum Rank
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Rank -> Rank -> Rank -> [Rank]
$cenumFromThenTo :: Rank -> Rank -> Rank -> [Rank]
enumFromTo :: Rank -> Rank -> [Rank]
$cenumFromTo :: Rank -> Rank -> [Rank]
enumFromThen :: Rank -> Rank -> [Rank]
$cenumFromThen :: Rank -> Rank -> [Rank]
enumFrom :: Rank -> [Rank]
$cenumFrom :: Rank -> [Rank]
fromEnum :: Rank -> Int
$cfromEnum :: Rank -> Int
toEnum :: Int -> Rank
$ctoEnum :: Int -> Rank
pred :: Rank -> Rank
$cpred :: Rank -> Rank
succ :: Rank -> Rank
$csucc :: Rank -> Rank
Enum,
Rank -> Rank -> Bool
(Rank -> Rank -> Bool) -> (Rank -> Rank -> Bool) -> Eq Rank
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Rank -> Rank -> Bool
$c/= :: Rank -> Rank -> Bool
== :: Rank -> Rank -> Bool
$c== :: Rank -> Rank -> Bool
Eq,
Eq Rank
Eq Rank
-> (Rank -> Rank -> Ordering)
-> (Rank -> Rank -> Bool)
-> (Rank -> Rank -> Bool)
-> (Rank -> Rank -> Bool)
-> (Rank -> Rank -> Bool)
-> (Rank -> Rank -> Rank)
-> (Rank -> Rank -> Rank)
-> Ord Rank
Rank -> Rank -> Bool
Rank -> Rank -> Ordering
Rank -> Rank -> Rank
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Rank -> Rank -> Rank
$cmin :: Rank -> Rank -> Rank
max :: Rank -> Rank -> Rank
$cmax :: Rank -> Rank -> Rank
>= :: Rank -> Rank -> Bool
$c>= :: Rank -> Rank -> Bool
> :: Rank -> Rank -> Bool
$c> :: Rank -> Rank -> Bool
<= :: Rank -> Rank -> Bool
$c<= :: Rank -> Rank -> Bool
< :: Rank -> Rank -> Bool
$c< :: Rank -> Rank -> Bool
compare :: Rank -> Rank -> Ordering
$ccompare :: Rank -> Rank -> Ordering
$cp1Ord :: Eq Rank
Ord
)
instance Control.DeepSeq.NFData Rank where
rnf :: Rank -> ()
rnf Rank
_ = ()
instance Data.Array.IArray.Ix Rank where
range :: (Rank, Rank) -> [Rank]
range (Rank
lower, Rank
upper) = Bool -> [Rank] -> [Rank]
forall a. (?callStack::CallStack) => Bool -> a -> a
Control.Exception.assert (Rank
lower Rank -> Rank -> Bool
forall a. Eq a => a -> a -> Bool
== Rank
forall a. Bounded a => a
minBound Bool -> Bool -> Bool
&& Rank
upper Rank -> Rank -> Bool
forall a. Eq a => a -> a -> Bool
== Rank
forall a. Bounded a => a
maxBound) [Rank]
range
inRange :: (Rank, Rank) -> Rank -> Bool
inRange (Rank
lower, Rank
upper) Rank
rank = Bool -> Bool -> Bool
forall a. (?callStack::CallStack) => Bool -> a -> a
Control.Exception.assert (Rank
rank Rank -> Rank -> Bool
forall a. Ord a => a -> a -> Bool
>= Rank
lower Bool -> Bool -> Bool
&& Rank
rank Rank -> Rank -> Bool
forall a. Ord a => a -> a -> Bool
<= Rank
upper) Bool
True
index :: (Rank, Rank) -> Rank -> Int
index (Rank
lower, Rank
upper) = Bool -> Int -> Int
forall a. (?callStack::CallStack) => Bool -> a -> a
Control.Exception.assert (Rank
lower Rank -> Rank -> Bool
forall a. Eq a => a -> a -> Bool
== Rank
forall a. Bounded a => a
minBound Bool -> Bool -> Bool
&& Rank
upper Rank -> Rank -> Bool
forall a. Eq a => a -> a -> Bool
== Rank
forall a. Bounded a => a
maxBound) (Int -> Int) -> (Rank -> Int) -> Rank -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rank -> Int
forall a. Enum a => a -> Int
fromEnum
instance Show Rank where
showsPrec :: Int -> Rank -> ShowS
showsPrec Int
_ Rank
rank = Char -> ShowS
showChar (Char -> ShowS) -> Char -> ShowS
forall a b. (a -> b) -> a -> b
$ case Rank
rank of
Rank
Pawn -> Char
'p'
Rank
Rook -> Char
'r'
Rank
Knight -> Char
'n'
Rank
Bishop -> Char
'b'
Rank
Queen -> Char
'q'
Rank
King -> Char
'k'
instance Read Rank where
readsPrec :: Int -> ReadS Rank
readsPrec Int
_ (Char
c : String
s)
| Char -> Bool
Data.Char.isSpace Char
c = ReadS Rank
forall a. Read a => ReadS a
reads String
s
| Bool
otherwise = (Rank -> (Rank, String)) -> [Rank] -> [(Rank, String)]
forall a b. (a -> b) -> [a] -> [b]
map ((Rank -> String -> (Rank, String))
-> String -> Rank -> (Rank, String)
forall a b c. (a -> b -> c) -> b -> a -> c
flip (,) String
s) ([Rank] -> [(Rank, String)]) -> [Rank] -> [(Rank, String)]
forall a b. (a -> b) -> a -> b
$ case Char -> Char
Data.Char.toLower Char
c of
Char
'p' -> [Rank
Pawn]
Char
'r' -> [Rank
Rook]
Char
'n' -> [Rank
Knight]
Char
'b' -> [Rank
Bishop]
Char
'q' -> [Rank
Queen]
Char
'k' -> [Rank
King]
Char
_ -> []
readsPrec Int
_ String
_ = []
instance HXT.XmlPickler Rank where
xpickle :: PU Rank
xpickle = String -> PU Rank -> PU Rank
forall a. String -> PU a -> PU a
HXT.xpAttr String
tag (PU Rank -> PU Rank)
-> ([String] -> PU Rank) -> [String] -> PU Rank
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Rank, Rank -> String) -> PU String -> PU Rank
forall a b. (a -> b, b -> a) -> PU a -> PU b
HXT.xpWrap (String -> Rank
forall a. Read a => String -> a
read, Rank -> String
forall a. Show a => a -> String
show) (PU String -> PU Rank)
-> ([String] -> PU String) -> [String] -> PU Rank
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Schema -> PU String
HXT.xpTextDT (Schema -> PU String)
-> ([String] -> Schema) -> [String] -> PU String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> Schema
Text.XML.HXT.Arrow.Pickle.Schema.scEnum ([String] -> PU Rank) -> [String] -> PU Rank
forall a b. (a -> b) -> a -> b
$ (Rank -> String) -> [Rank] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Rank -> String
forall a. Show a => a -> String
show [Rank]
range
flank :: [Rank]
flank :: [Rank]
flank = [Rank
Rook, Rank
Knight, Rank
Bishop]
promotionProspects :: [Rank]
promotionProspects :: [Rank]
promotionProspects = Rank
Queen Rank -> [Rank] -> [Rank]
forall a. a -> [a] -> [a]
: [Rank]
flank
defaultPromotionRank :: Rank
defaultPromotionRank :: Rank
defaultPromotionRank = Rank
Queen
plodders :: [Rank]
plodders :: [Rank]
plodders = [Rank
Pawn, Rank
King]
fixedAttackRange :: [Rank]
fixedAttackRange :: [Rank]
fixedAttackRange = Rank
Knight Rank -> [Rank] -> [Rank]
forall a. a -> [a] -> [a]
: [Rank]
plodders
individuallySufficientMaterial :: [Rank]
individuallySufficientMaterial :: [Rank]
individuallySufficientMaterial = [Rank
Pawn, Rank
Rook, Rank
Queen]
royalty :: [Rank]
royalty :: [Rank]
royalty = [Rank
Queen, Rank
King]
pieces :: [Rank]
pieces :: [Rank]
pieces = [Rank]
flank [Rank] -> [Rank] -> [Rank]
forall a. [a] -> [a] -> [a]
++ [Rank]
royalty
nobility :: [Rank]
nobility :: [Rank]
nobility = [Rank]
pieces [Rank] -> [Rank] -> [Rank]
forall a. [a] -> [a] -> [a]
++ [Rank] -> [Rank]
forall a. [a] -> [a]
reverse [Rank]
flank
range :: [Rank]
range :: [Rank]
range = [Rank
forall a. Bounded a => a
minBound .. Rank
forall a. Bounded a => a
maxBound]
expendable :: [Rank]
expendable :: [Rank]
expendable = Rank -> [Rank] -> [Rank]
forall a. Eq a => a -> [a] -> [a]
Data.List.delete Rank
King [Rank]
range
type EvaluateRank rankValue = Rank -> rankValue
compareByLVA
:: Ord rankValue
=> EvaluateRank rankValue
-> Rank
-> Rank
-> Ordering
compareByLVA :: EvaluateRank rankValue -> Rank -> Rank -> Ordering
compareByLVA EvaluateRank rankValue
evaluateRank Rank
rankL Rank
rankR
| Rank
rankL Rank -> Rank -> Bool
forall a. Eq a => a -> a -> Bool
== Rank
rankR = Ordering
EQ
| Rank
rankL Rank -> Rank -> Bool
forall a. Eq a => a -> a -> Bool
== Rank
King = Ordering
GT
| Rank
rankR Rank -> Rank -> Bool
forall a. Eq a => a -> a -> Bool
== Rank
King = Ordering
LT
| Bool
otherwise = EvaluateRank rankValue -> Rank -> Rank -> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
Data.Ord.comparing EvaluateRank rankValue
evaluateRank Rank
rankL Rank
rankR
type NRanks = Int
nDistinctRanks :: NRanks
nDistinctRanks :: Int
nDistinctRanks = [Rank] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Rank]
range
type ByRank = Data.Array.IArray.Array Rank
listArrayByRank :: Data.Array.IArray.IArray a e => [e] -> a Rank e
listArrayByRank :: [e] -> a Rank e
listArrayByRank = (Rank, Rank) -> [e] -> a Rank e
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
(i, i) -> [e] -> a i e
Data.Array.IArray.listArray (Rank
forall a. Bounded a => a
minBound, Rank
forall a. Bounded a => a
maxBound)
class Promotable a where
getMaybePromotionRank :: a -> Maybe Rank