fn countup<T>(start: T) -> impl Iterator<Item=T> where T: TryFrom<usize> + num::CheckedAdd, { let one = T::try_from(1).ok().unwrap(); itertools::unfold(Some(start), move |n| { if let &mut Some(ref m) = n { let mut next = m.checked_add(&one); std::mem::swap(n, &mut next); next } else { None } }) }