use brk_error::Result; use brk_traversable::Traversable; use brk_types::{Height, Version}; use derive_more::{Deref, DerefMut}; use schemars::JsonSchema; use vecdb::{ BinaryTransform, Database, EagerVec, Exit, ImportableVec, PcoVec, ReadableCloneableVec, ReadableVec, Rw, StorageMode, VecValue, }; use crate::indexes; use crate::internal::{ComputedHeightDerived, ComputedVecValue, NumericValue}; #[derive(Deref, DerefMut, Traversable)] #[traversable(merge)] pub struct ComputedFromHeight where T: ComputedVecValue + PartialOrd + JsonSchema, { pub height: M::Stored>>, #[deref] #[deref_mut] #[traversable(flatten)] pub rest: Box>, } impl ComputedFromHeight where T: NumericValue + JsonSchema, { pub(crate) fn forced_import( db: &Database, name: &str, version: Version, indexes: &indexes::Vecs, ) -> Result { let height: EagerVec> = EagerVec::forced_import(db, name, version)?; let rest = ComputedHeightDerived::forced_import( name, height.read_only_boxed_clone(), version, indexes, ); Ok(Self { height, rest: Box::new(rest), }) } /// Eagerly compute this vec as a binary transform of two sources. pub(crate) fn compute_binary( &mut self, max_from: Height, source1: &impl ReadableVec, source2: &impl ReadableVec, exit: &Exit, ) -> Result<()> where S1T: VecValue, S2T: VecValue, F: BinaryTransform, { self.height .compute_binary::(max_from, source1, source2, exit)?; Ok(()) } }