#markov #markov-chain #random #serialize #markov-text

no-std markov-generator

Highly customizable crate for building Markov chains and generating data from them

6 releases

0.1.5 Dec 23, 2022
0.1.4 Dec 20, 2022
0.1.2 Nov 11, 2022
0.1.1 Aug 25, 2022

#481 in Data structures


381 lines


A highly customizable Rust library for building Markov chains and generating sequences of data from them.

Chain implements Serde's Serialize and Deserialize traits, so you can use a chain multiple times without having to regenerate it every time (which can be a lengthy process).


use markov_generator::{AddEdges, Chain};

const DEPTH: usize = 6;
// Maps each sequence of 6 items to a list of possible next items.
let mut chain = Chain::new(DEPTH);

// In this case, corpus.txt contains one paragraph per line.
let file = File::open("examples/corpus.txt").unwrap();
let mut reader = BufReader::new(file);
let mut line = String::new();
let mut prev_line = String::new();

while let Ok(1..) = reader.read_line(&mut line) {
    // `Both` means that the generated random output could start with the
    // beginning of `line`, and that the generated output could end after
    // the end of `line`.
    chain.add_all(line.chars(), AddEdges::Both);

    // Starting index of last `DEPTH` chars in `prev_line`.
    let prev_tail =
        prev_line.char_indices().nth_back(DEPTH - 1).map_or(0, |(i, _)| i);

    // This makes sure there's a chance that the end of the previous line
    // could be followed by the start of the current line when generating
    // random output.

    std::mem::swap(&mut line, &mut prev_line);

// Generate and print random Markov data.
let output: String = chain
    .flat_map(|c| iter::repeat(c).take(1 + (*c == '\n') as usize))
print!("{}", &output[..output.len() - 1]);

Crate features

  • std (default: enabled): Use std. If disabled, this crate is marked no_std.
  • hash (default: enabled): Use hash maps internally. If disabled, B-trees will be used instead. This feature requires std.
  • serde (default: enabled): Implement Serde's Serialize and Deserialize traits for Chain.


~36K SLoC