use markov_generator::{AddEdges, HashChain};
use std::fs::File;
use std::io::{self, BufRead, BufReader, BufWriter, Write};
fn main() -> io::Result<()> {
const DEPTH: usize = 6;
let mut chain = HashChain::new(DEPTH);
let file = File::open("examples/corpus.txt")?;
let mut reader = BufReader::new(file);
let mut line = String::new();
let mut prev = Vec::<char>::new();
while let Ok(1..) = reader.read_line(&mut line) {
chain.add_all(line.chars(), AddEdges::Both);
chain.add_all(
prev.iter().copied().chain(line.chars().take(DEPTH)),
AddEdges::Neither,
);
if let Some((n, (i, _c))) =
line.char_indices().rev().enumerate().take(DEPTH).last()
{
prev.drain(0..prev.len().saturating_sub(DEPTH - n - 1));
prev.extend(line[i..].chars());
}
line.clear();
}
let mut stdout = BufWriter::new(io::stdout().lock());
let mut prev_newline = false;
for &c in chain.generate() {
if prev_newline {
writeln!(stdout)?;
}
prev_newline = c == '\n';
write!(stdout, "{c}")?;
}
stdout.flush()
}