Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct RunLength<I>
- where
- I: Iterator,
- {
- iter: I,
- saved: Option<I::Item>,
- }
- impl<I> RunLength<I>
- where
- I: Iterator,
- {
- fn new(iter: I) -> Self {
- Self { iter, saved: None }
- }
- }
- impl<I> Iterator for RunLength<I>
- where
- I: Iterator,
- <I as std::iter::Iterator>::Item: PartialEq,
- {
- type Item = (I::Item, usize);
- fn next(&mut self) -> Option<Self::Item> {
- let c = self.saved.take().or_else(|| self.iter.next())?;
- let mut count = 1;
- while let Some(n) = self.iter.next() {
- if n == c {
- count += 1
- } else {
- self.saved = Some(n);
- break;
- }
- }
- Some((c, count))
- }
- }
- pub fn encode_tiny(data: &str) -> String {
- use std::fmt::Write;
- RunLength::new(data.chars()).fold(String::new(), |mut s, (c, count)| {
- match count {
- 1 => s.push(c),
- n => write!(&mut s, "{}{}", n, c).unwrap(),
- }
- s
- })
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement