Guest User

Untitled

a guest
May 21st, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.46 KB | None | 0 0
  1. #![feature(generators, generator_trait)]
  2.  
  3. extern crate arrayvec;
  4.  
  5. use arrayvec::{Array, ArrayVec};
  6.  
  7. macro_rules! gen_iter {
  8. ($($exp:tt)*) => {
  9. GenIter(move || {
  10. $($exp)*
  11. })
  12. }
  13. }
  14.  
  15. fn chunks<A, I>(iter: I) -> impl Iterator<Item = ArrayVec<A>>
  16. where
  17. A: Array,
  18. I: IntoIterator<Item = A::Item>,
  19. {
  20. let mut iter = iter.into_iter();
  21. gen_iter! {
  22. loop {
  23. let mut arr = ArrayVec::new();
  24. while arr.len() != arr.capacity() {
  25. if let Some(element) = iter.next() {
  26. arr.push(element);
  27. } else {
  28. return;
  29. }
  30. }
  31. yield arr;
  32. }
  33. }
  34. }
  35.  
  36. fn main() {
  37. let vec = vec![1, 2, 3, 4, 5, 6, 7, 8];
  38. for chunk in chunks::<[_; 2], _>(vec) {
  39. println!("{:?}", chunk);
  40. }
  41. }
  42.  
  43. use std::ops::{Generator, GeneratorState};
  44. use std::iter::Iterator;
  45.  
  46. /// a iterator that holds an internal generator representing
  47. /// the iteration state
  48. #[derive(Copy, Clone, Debug)]
  49. pub struct GenIter<T>(pub T)
  50. where T: Generator;
  51.  
  52. impl<T: Generator> Iterator for GenIter<T> {
  53. type Item = <T as Generator>::Yield;
  54.  
  55. fn next(&mut self) -> Option<Self::Item> {
  56. match unsafe { self.0.resume() } {
  57. GeneratorState::Yielded(n) => Some(n),
  58. GeneratorState::Complete(_) => None,
  59. }
  60. }
  61. }
  62.  
  63. impl<G: Generator> From<G> for GenIter<G> {
  64. fn from(gen: G) -> Self {
  65. GenIter(gen)
  66. }
  67. }
Add Comment
Please, Sign In to add comment