use std::borrow::Borrow; /// Iter that converts 2 `u8`s into 1 `u16` pub struct Bit16Iter where I: Iterator, ::Item: Borrow { iter: I, } impl Iterator for Bit16Iter where I: Iterator, ::Item: Borrow { type Item = u16; fn next(&mut self) -> Option { let mut ar = [0u8; std::mem::size_of::()]; if let Some(a) = self.iter.next() { ar[0] = *a.borrow(); } else { return None; } if let Some(b) = self.iter.next() { ar[1] = *b.borrow(); } Some(u16::from_le_bytes(ar)) } fn size_hint(&self) -> (usize, Option) { let (l, h) = self.iter.size_hint(); (l/2, h.map(|x| x/2)) } } impl std::iter::FusedIterator for Bit16Iter where I: Iterator + std::iter::FusedIterator, ::Item: Borrow{} impl ExactSizeIterator for Bit16Iter where I: Iterator + ExactSizeIterator, ::Item: Borrow{} pub trait Bit16IterExt: Iterator + Sized where ::Item: Borrow { fn into_16(self) -> Bit16Iter; } impl Bit16IterExt for I where I: Iterator, ::Item: Borrow { fn into_16(self) -> Bit16Iter { Bit16Iter{ iter: self } } }