diff --git a/src/main.rs b/src/main.rs index eb0cb91..3fc28c4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,15 +4,30 @@ mod rentry; const PASTE_NAME: &str = "Hyprland-controversy"; -pub struct EditCodeGenerator { - codes: Vec, - index: usize, +pub struct EditCodeGenerator +where + I: Iterator, +{ + inner: I, + last_item: Option, + retry: bool, } -impl EditCodeGenerator { +impl EditCodeGenerator +where + I: Iterator, +{ + pub fn new(inner: I) -> Self { + EditCodeGenerator { + inner, + last_item: None, + retry: false, + } + } + pub fn retry_last(&mut self) -> Option<()> { - if self.index > 0 { - self.index -= 1; + if let Some(ref _item) = self.last_item { + self.retry = true; Some(()) } else { None @@ -20,29 +35,33 @@ impl EditCodeGenerator { } } -impl Default for EditCodeGenerator { +impl Iterator for EditCodeGenerator +where + I: Iterator, +{ + type Item = String; + + fn next(&mut self) -> Option { + if self.retry { + self.retry = false; + return self.last_item.clone(); + } + + let next_item = self.inner.next(); + self.last_item = next_item.clone(); + next_item + } +} + +impl Default for EditCodeGenerator> { fn default() -> Self { let codes = (b'a'..=b'z') .map(|c| (c as char).to_string()) .chain((b'A'..=b'Z').map(|c| (c as char).to_string())) .chain((b'0'..=b'9').map(|c| (c as char).to_string())) - .collect(); + .collect::>(); - EditCodeGenerator { codes, index: 0 } - } -} - -impl Iterator for EditCodeGenerator { - type Item = String; - - fn next(&mut self) -> Option { - if self.index < self.codes.len() { - let code = self.codes[self.index].clone(); - self.index += 1; - Some(code) - } else { - None - } + EditCodeGenerator::new(codes.into_iter()) } }