Guest User

Untitled

a guest
Aug 20th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.96 KB | None | 0 0
  1. use std::iter::Iterator;
  2. use std::borrow::Borrow;
  3.  
  4. trait SequencePositionExt : Iterator
  5. where Self: Sized
  6. {
  7. fn sequence_position<T>(mut self, seq: &[T]) -> Option<usize>
  8. where Self::Item : Borrow<T>, T: PartialEq
  9. {
  10. let mut pos = 0;
  11. let mut ring = Vec::with_capacity(seq.len());
  12. for _ in seq {
  13. ring.push(None);
  14. }
  15. let mut ring_pos = 0;
  16. while let Some(item) = self.next() {
  17. pos += 1;
  18. ring[ring_pos] = Some(item);
  19. ring_pos += 1;
  20. if ring_pos == ring.len() {
  21. ring_pos = 0;
  22. }
  23. if ring.iter().cycle().skip(ring_pos).take(ring.len()).map(|x| x.as_ref().map(|x| x.borrow())).eq(seq.iter().map(Some)) {
  24. return Some(pos - seq.len());
  25. }
  26. }
  27. None
  28. }
  29. }
  30.  
  31. impl<T: Iterator + Sized> SequencePositionExt for T {}
  32.  
  33. fn main() {
  34. println!("{:?}", [2,4,6,3].iter().sequence_position(&[2,4]));
  35. }
Add Comment
Please, Sign In to add comment