1#![doc = include_str!("../README.md")]
2#![doc = "\n## Example\n\n```rust"]
3#![doc = include_str!("../examples/main.rs")]
4#![doc = "```"]
5
6use std::path::{Path, PathBuf};
7
8use brk_core::Version;
9use brk_exit::Exit;
10use brk_fetcher::Fetcher;
11use brk_indexer::Indexer;
12use brk_vec::{AnyCollectableVec, Computation, Format};
13
14mod stores;
15mod utils;
16mod vecs;
17
18use log::info;
19use stores::Stores;
20use vecs::Vecs;
21
22#[derive(Clone)]
23pub struct Computer {
24 path: PathBuf,
25 fetcher: Option<Fetcher>,
26 vecs: Option<Vecs>,
27 stores: Option<Stores>,
28 format: Format,
29}
30
31const VERSION: Version = Version::ONE;
32
33impl Computer {
34 pub fn new(outputs_dir: &Path, fetcher: Option<Fetcher>, format: Format) -> Self {
35 Self {
36 path: outputs_dir.to_owned(),
37 fetcher,
38 vecs: None,
39 stores: None,
40 format,
41 }
42 }
43
44 pub fn import_vecs(
45 &mut self,
46 indexer: &Indexer,
47 computation: Computation,
48 ) -> color_eyre::Result<()> {
49 self.vecs = Some(Vecs::import(
50 &self.path.join("vecs/computed"),
52 VERSION + Version::ZERO,
53 indexer,
54 self.fetcher.is_some(),
55 computation,
56 self.format,
57 )?);
58 Ok(())
59 }
60
61 pub fn import_stores(&mut self, indexer: &Indexer) -> color_eyre::Result<()> {
64 self.stores = Some(Stores::import(
65 &self.path.join("stores"),
67 VERSION + Version::ZERO,
68 indexer.keyspace(),
69 )?);
70 Ok(())
71 }
72}
73
74impl Computer {
75 pub fn compute(
76 &mut self,
77 indexer: &mut Indexer,
78 starting_indexes: brk_indexer::Indexes,
79 exit: &Exit,
80 ) -> color_eyre::Result<()> {
81 info!("Computing...");
82 self.vecs
83 .as_mut()
84 .unwrap()
85 .compute(indexer, starting_indexes, self.fetcher.as_mut(), exit)
86 }
87
88 pub fn vecs(&self) -> Vec<&dyn AnyCollectableVec> {
89 self.vecs.as_ref().unwrap().vecs()
91 }
92
93 pub fn stores(&self) -> &Stores {
98 self.stores.as_ref().unwrap()
99 }
100
101 pub fn mut_stores(&mut self) -> &mut Stores {
102 self.stores.as_mut().unwrap()
103 }
104}