use std::collections::BTreeMap;
pub fn b2s(b: bool) -> &'static str {
if b {"1"} else {"0"}
}
pub struct LinebreakSet {
map: BTreeMap<usize, usize>,
}
impl LinebreakSet {
pub fn new() -> Self {
Self {
map: BTreeMap::new(),
}
}
pub fn add(&mut self, i: usize) {
let new_val = self.map.get(&i).unwrap_or(&0) + 1;
self.map.insert(i, new_val);
}
pub fn iter(&self) -> LinebreakSetIter {
LinebreakSetIter {
last_break_val: 0,
last_break_rep: 0,
set_iter: self.map.iter(),
}
}
}
pub struct LinebreakSetIter<'a> {
last_break_val: usize,
last_break_rep: usize,
set_iter: ::std::collections::btree_map::Iter<'a, usize, usize>,
}
impl<'a> Iterator for LinebreakSetIter<'a> {
type Item = usize;
fn next(&mut self) -> Option<usize> {
if self.last_break_rep == 0 {
let next_item = self.set_iter.next();
if next_item.is_none() {
None
} else {
let (&k, &v) = next_item.unwrap();
self.last_break_val = k;
self.last_break_rep = v - 1;
Some(k)
}
} else {
self.last_break_rep -= 1;
Some(self.last_break_val)
}
}
}