結局見やすくこう書けるといいんだよね
let r = pair(1..100, 1..100).find(|(x, y)| x * y > 1234);
assert_eq!(r, Some((13, 95)));
これでassertも通ったけどyのイテレータとx自身の2ヶ所にCloneが必要となってしまった
避けられないような気がするけどどうでしょうか?
fn pair<IX: Iterator<Item=X>, IY: Iterator<Item=Y> + Clone, X, Y>(ix: IX, iy: IY) -> Pair<IX, IY, X, Y> {
 Pair { cur_ox: None, cur_iy: iy.clone(), ix: ix, iy: iy, }
}
struct Pair<IX: Iterator<Item=X>, IY: Iterator<Item=Y>, X, Y> {
 cur_ox: Option<X>, cur_iy: IY, ix: IX, iy: IY,
}
impl<IX: Iterator<Item=X>, IY: Iterator<Item=Y> + Clone, X: Clone, Y> Iterator for Pair<IX, IY, X, Y> {
 type Item = (X, Y);
 fn next(&mut self) -> Option<Self::Item> {
  loop {
    if let None = self.cur_ox {
     self.cur_ox = self.ix.next();
    }
    if let Some(ref x) = self.cur_ox {
     if let Some(y) = self.cur_iy.next() {
      break Some((x.clone(), y));
     } else {
      self.cur_ox = None;
      self.cur_iy = self.iy.clone();
      continue;
     }
    } else {
     break None;
    }
  }
 }
}