Skip to content

Instantly share code, notes, and snippets.

@ayosec
Created December 21, 2020 11:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ayosec/0675353357cc3a04424ffab0e1c381e4 to your computer and use it in GitHub Desktop.
Save ayosec/0675353357cc3a04424ffab0e1c381e4 to your computer and use it in GitHub Desktop.
struct Seqs<I> {
iter: I,
}
impl<'a, I: Iterator<Item = &'a u8>> Iterator for Seqs<std::iter::Enumerate<I>> {
type Item = (usize, usize);
fn next(&mut self) -> Option<Self::Item> {
// Jump to first byte '1'
let start = loop {
match self.iter.next() {
Some((i, b'1')) => break i,
None => return None,
_ => (),
}
};
// Find end
let mut last_i = start;
loop {
match self.iter.next() {
None => return Some((start, last_i + 1)),
Some((i, b'0')) => return Some((start, i)),
Some((i, _)) => last_i = i,
}
}
}
}
fn main() {
let x = b"00010110011100111100011111";
let seqs = Seqs {
iter: x.iter().enumerate(),
};
for seq in seqs {
let _ = dbg!(std::str::from_utf8(&x[seq.0..seq.1]));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment