Skip to content

Instantly share code, notes, and snippets.

@justanotherdot
Last active August 11, 2020 23:02
Show Gist options
  • Save justanotherdot/bce66ab9c19fff8048590e84dec4f20d to your computer and use it in GitHub Desktop.
Save justanotherdot/bce66ab9c19fff8048590e84dec4f20d to your computer and use it in GitHub Desktop.
Simple 2-dimensional cartesian product using std::iter::from_fn.
fn main() {
let xs = vec![1, 2, 3];
let ys = vec![6, 5, 4];
let mut i = 0;
let mut j = 0;
let iter = std::iter::from_fn(|| {
if i >= xs.len() {
return None;
}
let rv = Some((xs[i], ys[j]));
j = (j + 1) % ys.len();
if j == 0 {
i += 1;
}
rv
});
let expected = vec![
(1, 6),
(1, 5),
(1, 4),
(2, 6),
(2, 5),
(2, 4),
(3, 6),
(3, 5),
(3, 4),
];
// alternatively you could do repeat for each element zipped
// with each latter list. you have to work backwards to do this.
assert_eq!(iter.collect::<Vec<_>>(), expected);
let mut i = 0;
let mut j = 0;
let xslen = xs.len();
let yslen = ys.len();
let iter = std::iter::from_fn(move || {
if i >= xslen {
return None;
}
let rv = Some((i, j));
j = (j + 1) % yslen;
if j == 0 {
i += 1;
}
rv
});
let mut results = vec![];
for (i, j) in iter.clone() {
results.push((xs[i], ys[j]));
}
assert_eq!(results, expected);
let mut results = vec![];
for (i, j) in iter {
results.push((xs[i], ys[j]));
}
assert_eq!(results, expected);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment