From 2d0e98c7f43099e932c90f26e24a279257f846c9 Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Tue, 14 Apr 2026 16:51:15 +0100 Subject: [PATCH] card: excessively simple card iterator --- src/card/iters.rs | 51 +++++++++++++++++++++++++++++++++++++++++++++++ src/card/mod.rs | 1 + 2 files changed, 52 insertions(+) create mode 100644 src/card/iters.rs diff --git a/src/card/iters.rs b/src/card/iters.rs new file mode 100644 index 0000000..fe6b107 --- /dev/null +++ b/src/card/iters.rs @@ -0,0 +1,51 @@ +use crate::card::{Card, PlayingCard, Rank, Suit}; + +pub struct CardIterator(Card); + +impl Iterator for CardIterator { + type Item = Card; + + fn next(&mut self) -> Option { + match self.0 { + Card::Joker(_) => None, + Card::PlayingCard(PlayingCard { + rank: Rank::Two, + suit: Suit::Spade, + deck, + }) => { + self.0 = Card::Joker((deck + 1) * -1); + None + } + Card::PlayingCard(pc) => { + self.0 = Card::from(i64::from(pc) + 1); + Some(self.0) + } + } + } +} + +impl DoubleEndedIterator for CardIterator { + fn next_back(&mut self) -> Option<::Item> { + match self.0 { + Card::Joker(_) => None, + Card::PlayingCard(PlayingCard { + rank: Rank::Three, + suit: Suit::Diamond, + deck, + }) => { + self.0 = Card::Joker((deck + 1) * -1); + None + } + Card::PlayingCard(pc) => { + self.0 = Card::from(i64::from(pc) - 1); + Some(self.0) + } + } + } +} + +impl Card { + pub fn into_iter(self) -> CardIterator { + CardIterator(self) + } +} diff --git a/src/card/mod.rs b/src/card/mod.rs index 369bb0f..c76466d 100644 --- a/src/card/mod.rs +++ b/src/card/mod.rs @@ -2,6 +2,7 @@ mod default; mod display; mod hash; mod impls; +mod iters; mod numerics; mod ord;