#[derive(Default, Debug)]
pub struct Restore {
pub pos_li: Vec<(usize, String)>,
}
impl Restore {
pub fn push(&mut self, pos: usize, str: String) {
self.pos_li.push((pos, str));
}
}
impl<S, I> std::ops::Shl<I> for Restore
where
I: IntoIterator<Item = S>,
S: AsRef<str>,
{
type Output = String;
fn shl(self, li: I) -> Self::Output {
let mut result = String::new();
let mut current_pos = 0;
let mut pos_iter = self.pos_li.iter().peekable();
for item in li.into_iter() {
while let Some((p, s)) = pos_iter.peek() {
if *p == current_pos {
result.push_str(s);
pos_iter.next();
} else {
break;
}
}
result.push_str(item.as_ref());
current_pos += 1;
}
for (_, s) in pos_iter {
result.push_str(s);
}
result
}
}