Last active
August 11, 2020 23:02
-
-
Save justanotherdot/bce66ab9c19fff8048590e84dec4f20d to your computer and use it in GitHub Desktop.
Simple 2-dimensional cartesian product using std::iter::from_fn.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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