xwords 0.1.0

Tooling to fill crossword puzzles
Documentation
use std::{fs::File, sync::Arc};
use xwords::fill::{parallel::ParallelFiller, single_threaded::SingleThreadedFiller};

use std::time::Instant;
use xwords::{crossword::Crossword, default_indexes};

use xwords::fill::Filler;

fn main() -> Result<(), String> {
    let args: Vec<String> = std::env::args().collect();
    let now = Instant::now();

    let guard = pprof::ProfilerGuard::new(1000).unwrap();
    std::thread::spawn(move || loop {
        match guard.report().build() {
            Ok(report) => {
                let file = File::create("flamegraph.svg").unwrap();
                report.flamegraph(file).unwrap();
            }
            Err(_) => {}
        };
        std::thread::sleep(std::time::Duration::from_secs(5))
    });

    let real_puz = Crossword::new(String::from(
        "
    *    *     
    *    *     
         *     
   *   *   *   
**    *        
      *     ***
     *    *    
   *       *   
    *    *     
***     *      
        *    **
   *   *   *   
     *         
     *    *    
     *    *    
",
    ))
    .unwrap();

    println!("{}", real_puz);

    let (bigrams, trie) = default_indexes();
    println!("Loaded indices in {}ms", now.elapsed().as_millis());

    let filler: Box<dyn Filler> = match args.get(1) {
        Some(flag) => {
            if flag != "parallel" {
                return Err(String::from("Unable to parse flag"));
            }
            Box::new(ParallelFiller::new(Arc::new(trie), Arc::new(bigrams)))
        }
        None => Box::new(SingleThreadedFiller::new(&trie, &bigrams)),
    };

    let filled_puz = filler.fill(&real_puz).unwrap();
    println!("Filled in {} seconds.", now.elapsed().as_secs());
    println!("{}", filled_puz);
    Ok(())
}