cellular_automaton/ruleset/
bsc.rs

1use wasm_bindgen::prelude::wasm_bindgen;
2
3use crate::rule;
4
5/// A ruleset containing birth, survival, and generation (B/S/C) rules.
6#[wasm_bindgen]
7#[derive(Clone, Debug, PartialEq, PartialOrd)]
8pub struct BSC {
9    #[wasm_bindgen(getter_with_clone)]
10    pub birth: rule::Birth,
11    #[wasm_bindgen(getter_with_clone)]
12    pub survival: rule::Survival,
13    pub generation: rule::Generation,
14}
15
16#[wasm_bindgen]
17impl BSC {
18    /// Constructs a new ruleset containing birth, survival, and generation rules.
19    ///
20    /// # Examples
21    ///
22    /// ```
23    /// use cellular_automaton::ruleset::BSC;
24    ///
25    /// let rules = BSC::default();
26    /// //  = BSC::new(&[3], &[2, 3], 2);
27    /// //  = BSC {
28    /// //      birth: vec![3],
29    /// //      survival: vec![2, 3],
30    /// //      generation: 1,
31    /// //  };
32    /// assert_eq!(rules.birth, vec![3]);
33    /// assert_eq!(rules.survival, vec![2, 3]);
34    /// assert_eq!(rules.generation, 1);
35    /// ```
36    #[wasm_bindgen(constructor)]
37    #[must_use]
38    pub fn new(b: &[u8], s: &[u8], c: u8) -> Self {
39        #[cfg(debug_assertions)]
40        console_error_panic_hook::set_once();
41
42        Self {
43            birth: b.to_vec(),
44            survival: s.to_vec(),
45            generation: c - 1,
46        }
47    }
48}
49
50impl Default for BSC {
51    /// Rules from Conway's Game of Life.
52    fn default() -> Self {
53        Self {
54            birth: vec![3],
55            survival: vec![2, 3],
56            generation: 1,
57        }
58    }
59}