use brk_error::Result; use brk_structs::{Bitcoin, DateIndex, Dollars, Sats, Version}; use vecdb::{AnyCollectableVec, CollectableVec, Database, EagerVec, Exit, StoredVec}; use crate::{ Indexes, grouped::ComputedVecsFromDateIndex, indexes, price, traits::{ComputeFromBitcoin, ComputeFromSats}, }; use super::{Source, VecBuilderOptions}; #[derive(Clone)] pub struct ComputedValueVecsFromDateIndex { pub sats: ComputedVecsFromDateIndex, pub bitcoin: ComputedVecsFromDateIndex, pub dollars: Option>, } const VERSION: Version = Version::ZERO; impl ComputedValueVecsFromDateIndex { #[allow(clippy::too_many_arguments)] pub fn forced_import( db: &Database, name: &str, source: Source, version: Version, options: VecBuilderOptions, compute_dollars: bool, indexes: &indexes::Vecs, ) -> Result { Ok(Self { sats: ComputedVecsFromDateIndex::forced_import( db, name, source, version + VERSION, indexes, options, )?, bitcoin: ComputedVecsFromDateIndex::forced_import( db, &format!("{name}_btc"), Source::Compute, version + VERSION, indexes, options, )?, dollars: compute_dollars.then(|| { ComputedVecsFromDateIndex::forced_import( db, &format!("{name}_usd"), Source::Compute, version + VERSION, indexes, options, ) .unwrap() }), }) } pub fn compute_all( &mut self, price: Option<&price::Vecs>, starting_indexes: &Indexes, exit: &Exit, mut compute: F, ) -> Result<()> where F: FnMut(&mut EagerVec) -> Result<()>, { compute(self.sats.dateindex.as_mut().unwrap())?; let dateindex: Option<&StoredVec> = None; self.compute_rest(price, starting_indexes, exit, dateindex)?; Ok(()) } pub fn compute_rest( &mut self, price: Option<&price::Vecs>, starting_indexes: &Indexes, exit: &Exit, dateindex: Option<&impl CollectableVec>, ) -> Result<()> { if let Some(dateindex) = dateindex { self.sats .compute_rest(starting_indexes, exit, Some(dateindex))?; self.bitcoin.compute_all(starting_indexes, exit, |v| { v.compute_from_sats(starting_indexes.dateindex, dateindex, exit) })?; } else { let dateindex: Option<&StoredVec> = None; self.sats.compute_rest(starting_indexes, exit, dateindex)?; self.bitcoin.compute_all(starting_indexes, exit, |v| { v.compute_from_sats( starting_indexes.dateindex, self.sats.dateindex.as_ref().unwrap(), exit, ) })?; } let dateindex_to_bitcoin = self.bitcoin.dateindex.as_ref().unwrap(); let dateindex_to_price_close = price .as_ref() .unwrap() .timeindexes_to_price_close .dateindex .as_ref() .unwrap(); if let Some(dollars) = self.dollars.as_mut() { dollars.compute_all(starting_indexes, exit, |v| { v.compute_from_bitcoin( starting_indexes.dateindex, dateindex_to_bitcoin, dateindex_to_price_close, exit, ) })?; } Ok(()) } pub fn iter_any_collectable(&self) -> impl Iterator { std::iter::empty() .chain(self.sats.iter_any_collectable()) .chain(self.bitcoin.iter_any_collectable()) .chain(self.dollars.iter().flat_map(|v| v.iter_any_collectable())) } }