A Rust crate that aims to generalize cellular automata creation. Current features include:
- Easy creation using the builder pattern
- Fast simulation engine
- Multiple versions for different use cases
- SIMD potential
- Very ergonomic design for creating simulations
- Full support for the builder pattern
- Multiple data collection functions for an automaton
- Arbitrary types support for cells' state and associated data
- Interface to create custom frontends (WIP)
An example illustrating Conway's Game of Life implementation in lifers
:
use lifers::prelude::*;
use rand::random;
fn main() {
// Use generic automaton with a 100x100 grid
let mut game = generic::Automaton::build((100, 100))
// Initialize all cells with random states (alive or dead)
.init(|_| random::<bool>())
// Count neighbors in radius of 1 for each cell
.map(|(x, y), _, cells| generic::count_neighbors(cells, (x, y), 1, |b| *b))
// Change cells' state depending on the number of neighbors
.run(|_, is_alive, neighbors_n| match is_alive {
true => (2..=3).contains(neighbors_n),
false => *neighbors_n == 3,
});
// Compute the next generation
game.step();
}