use std::iter::Peekable;
use strum::IntoEnumIterator;
use super::{Division, Tier};
pub type Rank = (Tier, Division);
pub struct Iter {
tier_iter: Peekable<<Tier as IntoEnumIterator>::Iterator>,
div_iter: <Division as IntoEnumIterator>::Iterator,
}
impl Iterator for Iter {
type Item = Rank;
fn next(&mut self) -> Option<Self::Item> {
let div = self.div_iter.next().unwrap_or_else(|| {
self.tier_iter.next();
self.div_iter = Division::iter();
self.div_iter.next().unwrap()
});
let tier = *self.tier_iter.peek()?;
if tier.is_apex() {
self.tier_iter.next();
self.div_iter = Division::iter();
}
Some((tier, div))
}
}
pub fn iter() -> Iter {
Iter {
tier_iter: Tier::iter().peekable(),
div_iter: Division::iter(),
}
}
pub fn non_apex_iter() -> Iter {
let mut tier_iter = Tier::iter().peekable();
while tier_iter.peek().unwrap().is_apex() {
tier_iter.next();
}
Iter {
tier_iter,
div_iter: Division::iter(),
}
}
#[cfg(test)]
mod tests {
use super::{Division, Tier};
#[test]
fn iter() {
let mut it = super::iter();
assert_eq!(Some((Tier::CHALLENGER, Division::I)), it.next());
assert_eq!(Some((Tier::GRANDMASTER, Division::I)), it.next());
assert_eq!(Some((Tier::MASTER, Division::I)), it.next());
assert_eq!(Some((Tier::DIAMOND, Division::I)), it.next());
assert_eq!(Some((Tier::DIAMOND, Division::II)), it.next());
let mut last = None;
for next in &mut it {
last = Some(next);
}
assert_eq!(Some((Tier::IRON, Division::IV)), last);
assert_eq!(None, it.next());
}
#[test]
fn non_apex_iter() {
let mut it = super::non_apex_iter();
assert_eq!(Some((Tier::DIAMOND, Division::I)), it.next());
assert_eq!(Some((Tier::DIAMOND, Division::II)), it.next());
assert_eq!(Some((Tier::DIAMOND, Division::III)), it.next());
assert_eq!(Some((Tier::DIAMOND, Division::IV)), it.next());
assert_eq!(Some((Tier::EMERALD, Division::I)), it.next());
assert_eq!(Some((Tier::EMERALD, Division::II)), it.next());
assert_eq!(Some((Tier::EMERALD, Division::III)), it.next());
assert_eq!(Some((Tier::EMERALD, Division::IV)), it.next());
assert_eq!(Some((Tier::PLATINUM, Division::I)), it.next());
let last = it.last();
assert_eq!(Some((Tier::IRON, Division::IV)), last);
}
}