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}