Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.08 KB | None | 0 0
  1. #![feature(generators, generator_trait)]
  2.  
  3. fn main() {
  4. let mut data = vec![3,2,1];
  5. for state in bubble_sort(&mut data) {
  6. dbg!(state);
  7. }
  8. }
  9.  
  10. fn bubble_sort<T>(items: &mut Vec<T>) -> impl Iterator<Item = Vec<T>> + '_
  11. where
  12. T: PartialOrd + Clone,
  13. {
  14. IterGen(move || {
  15. loop {
  16. let mut swapped = false;
  17.  
  18. for i in 1..items.len() {
  19. if items[i-1] > items[i] {
  20. items.swap(i-1, i);
  21. swapped = true;
  22. yield items.clone();
  23. }
  24. }
  25.  
  26. if !swapped { break }
  27. }
  28. })
  29. }
  30.  
  31. // ==== Generator -> Iterator boilerplate
  32.  
  33. use std::ops::{Generator, GeneratorState};
  34. use std::pin::Pin;
  35.  
  36. pub struct IterGen<G: Generator>(pub G);
  37.  
  38. impl<G> Iterator for IterGen<G>
  39. where
  40. G: Generator<Return = ()> + Unpin,
  41. {
  42. type Item = G::Yield;
  43.  
  44. fn next(&mut self) -> Option<Self::Item> {
  45. match { Pin::new(&mut self.0).resume() } {
  46. GeneratorState::Yielded(element) => Some(element),
  47. _ => None,
  48. }
  49. }
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement