ecgen/
gray_code.rs

1use genawaiter::sync::{Gen, GenBoxed};
2
3/// The `brgc_gen` function generates a binary reflexed gray code sequence of length `n`.
4///
5/// Arguments:
6///
7/// * `n`: The parameter `n` represents the number of bits in the binary reflexed gray code sequence.
8///
9/// Returns:
10///
11/// The function `brgc_gen` returns a `GenBoxed<usize>`, which is a boxed generator that yields values
12/// of type `usize`.
13///
14/// # Examples
15///
16/// ```
17/// use ecgen::brgc_gen;
18///  
19/// let mut lst = ["⬜"; 3];
20/// println!("{}", lst.concat());
21/// let mut cnt = 1;
22/// for n in brgc_gen(lst.len()) {
23///     lst[n] = if lst[n] == "⬜" { "⬛" } else { "⬜" };
24///     println!("{}", lst.concat());
25///     cnt += 1;
26/// }
27///
28/// assert_eq!(cnt, 8);
29/// ```
30pub fn brgc_gen(n: usize) -> GenBoxed<usize> {
31    Gen::new_boxed(|co| async move {
32        if n < 1 {
33            return;
34        }
35        for i in brgc_gen(n - 1) {
36            co.yield_(i).await;
37        }
38        co.yield_(n - 1).await;
39        for i in brgc_gen(n - 1) {
40            co.yield_(i).await;
41        }
42    })
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn test_brgc() {
51        let mut cnt = 1;
52        for _n in brgc_gen(3) {
53            cnt += 1;
54        }
55        assert_eq!(cnt, 8);
56    }
57}