use brk_error::Result; use brk_indexer::Indexer; use brk_structs::{DifficultyEpoch, Height, Version}; use vecdb::{AnyCollectableVec, Database, EagerVec, Exit}; use crate::{Indexes, indexes}; use super::{ComputedType, EagerVecBuilder, VecBuilderOptions}; #[derive(Clone)] pub struct ComputedVecsFromHeightStrict where T: ComputedType + PartialOrd, { pub height: EagerVec, pub height_extra: EagerVecBuilder, pub difficultyepoch: EagerVecBuilder, // TODO: pub halvingepoch: StorableVecGeneator, } const VERSION: Version = Version::ZERO; impl ComputedVecsFromHeightStrict where T: ComputedType + Ord + From, f64: From, { pub fn forced_import( db: &Database, name: &str, version: Version, options: VecBuilderOptions, ) -> Result { let height = EagerVec::forced_import_compressed(db, name, version + VERSION + Version::ZERO)?; let height_extra = EagerVecBuilder::forced_import_compressed( db, name, version + VERSION + Version::ZERO, options.copy_self_extra(), )?; let options = options.remove_percentiles(); Ok(Self { height, height_extra, difficultyepoch: EagerVecBuilder::forced_import_compressed( db, name, version + VERSION + Version::ZERO, options, )?, // halvingepoch: StorableVecGeneator::forced_import(db, name, version + VERSION + Version::ZERO, format, options)?, }) } pub fn compute( &mut self, indexer: &Indexer, indexes: &indexes::Vecs, starting_indexes: &Indexes, exit: &Exit, mut compute: F, ) -> Result<()> where F: FnMut(&mut EagerVec, &Indexer, &indexes::Vecs, &Indexes, &Exit) -> Result<()>, { compute(&mut self.height, indexer, indexes, starting_indexes, exit)?; self.height_extra .extend(starting_indexes.height, &self.height, exit)?; self.difficultyepoch.compute( starting_indexes.difficultyepoch, &self.height, &indexes.difficultyepoch_to_first_height, &indexes.difficultyepoch_to_height_count, exit, )?; Ok(()) } pub fn vecs(&self) -> Vec<&dyn AnyCollectableVec> { [ vec![&self.height as &dyn AnyCollectableVec], self.height_extra.vecs(), self.difficultyepoch.vecs(), // self.halvingepoch.vecs(), ] .into_iter() .flatten() .collect::>() } }