card: make_decks -> Card::iter_all, PlayingCard::iter_deck -> iter_all
This commit is contained in:
37
src/card.rs
37
src/card.rs
@@ -42,8 +42,8 @@ impl Rank {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Generate an iterator over all ranks. */
|
/** Generate an iterator over all ranks. */
|
||||||
pub fn iter_all() -> impl Iterator<Item = Rank> {
|
pub fn iter_all() -> impl ExactSizeIterator<Item = Rank> {
|
||||||
(0..13).filter_map(|x| Rank::try_from(x).ok())
|
(0i32..13).map(|n| Rank::try_from(n as i64).unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Generate an iterator over all cards within a rank, ordered by Suit. */
|
/** Generate an iterator over all cards within a rank, ordered by Suit. */
|
||||||
@@ -76,7 +76,9 @@ impl PlayingCard {
|
|||||||
(rank * 4) + suit
|
(rank * 4) + suit
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn iter_deck(deck: usize) -> impl Iterator<Item = Self> {
|
/** Generate an iterator over all Playing Cards in a fixed deck. By
|
||||||
|
construction this is in ascending order. */
|
||||||
|
pub fn iter_all(deck: usize) -> impl Iterator<Item = Self> {
|
||||||
let deck = deck as i64;
|
let deck = deck as i64;
|
||||||
((deck * 52)..((deck + 1) * 52))
|
((deck * 52)..((deck + 1) * 52))
|
||||||
.filter_map(|x| PlayingCard::try_from(x).ok())
|
.filter_map(|x| PlayingCard::try_from(x).ok())
|
||||||
@@ -99,6 +101,20 @@ impl Card {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Generate an iterator over a `n` decks of Cards. Each deck is
|
||||||
|
concatenated together. By construction, each "deck" of the iterator is in
|
||||||
|
ascending order.
|
||||||
|
|
||||||
|
Note that each deck gets two jokers.
|
||||||
|
*/
|
||||||
|
pub fn iter_all(n: usize) -> impl Iterator<Item = Card> {
|
||||||
|
(-((n as i64) * 2)..0).map(Card::from).chain(
|
||||||
|
(0..n)
|
||||||
|
.flat_map(PlayingCard::iter_all)
|
||||||
|
.map(Card::PlayingCard),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn is_joker(&self) -> bool {
|
pub fn is_joker(&self) -> bool {
|
||||||
matches!(self, Self::Joker(_))
|
matches!(self, Self::Joker(_))
|
||||||
}
|
}
|
||||||
@@ -126,16 +142,6 @@ pub fn all_same_rank(cards: &[PlayingCard]) -> bool {
|
|||||||
cards[1..].iter().all(|card| rank == card.rank)
|
cards[1..].iter().all(|card| rank == card.rank)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Generate a vector of cards representing the concatenation of
|
|
||||||
`number_of_decks` decks of playing cards put together.
|
|
||||||
|
|
||||||
Note that each deck gets two jokers - this is added to the overall vector.
|
|
||||||
*/
|
|
||||||
pub fn make_decks(number_of_decks: usize) -> impl Iterator<Item = Card> {
|
|
||||||
let number_of_decks: i64 = number_of_decks.try_into().unwrap();
|
|
||||||
(-(number_of_decks * 2)..(52 * number_of_decks)).map(Card::from)
|
|
||||||
}
|
|
||||||
|
|
||||||
mod trait_display {
|
mod trait_display {
|
||||||
use super::*;
|
use super::*;
|
||||||
use std::fmt::{Display, Formatter};
|
use std::fmt::{Display, Formatter};
|
||||||
@@ -299,9 +305,8 @@ mod traits_ord {
|
|||||||
fn cmp(&self, other: &Self) -> Ordering {
|
fn cmp(&self, other: &Self) -> Ordering {
|
||||||
match (self, other) {
|
match (self, other) {
|
||||||
(Self::PlayingCard(c1), Self::PlayingCard(c2)) => c1.cmp(c2),
|
(Self::PlayingCard(c1), Self::PlayingCard(c2)) => c1.cmp(c2),
|
||||||
// Jokers should order themselves based on what deck they belong
|
// Jokers should not really care about internal ordering.
|
||||||
// to.
|
(Self::Joker(_), Self::Joker(_)) => Ordering::Equal,
|
||||||
(Self::Joker(x), Self::Joker(y)) => x.cmp(y),
|
|
||||||
// Jokers are the lowest possible card so any Playing Cards are
|
// Jokers are the lowest possible card so any Playing Cards are
|
||||||
// better than them.
|
// better than them.
|
||||||
(Self::Joker(_), _) => Ordering::Less,
|
(Self::Joker(_), _) => Ordering::Less,
|
||||||
|
|||||||
Reference in New Issue
Block a user