Advertisement
Guest User

Untitled

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