use crate::Serial;
use std::{
fmt,
fmt::{Display, Formatter},
};
#[derive(Clone, Debug)]
pub struct SerialGenerator<T: Serial = u32> {
value: T,
}
impl<T: Serial> SerialGenerator<T> {
pub fn new() -> Self {
Self::default()
}
pub fn with_init_value(value: T) -> Self {
SerialGenerator { value }
}
pub fn generate(&mut self) -> T {
let current = self.value.clone();
let next = current.next_increment();
self.value = next;
current
}
pub fn previous(&self) -> Option<T> {
if self.value == T::START {
None
} else {
Some(self.value.prev_increment())
}
}
pub fn remaining_increments(&self) -> T {
self.value.remaining_increments()
}
pub fn has_remaining_increments(&self) -> bool {
self.value.is_max_value()
}
}
impl<T: Serial> Default for SerialGenerator<T> {
fn default() -> Self {
SerialGenerator { value: T::START }
}
}
impl<T: fmt::Debug + Display + Serial> Display for SerialGenerator<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", self)
}
}
impl<T: Serial> Iterator for SerialGenerator<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
let next_value = self.generate();
Some(next_value)
}
}