apple-quant-algorithmic 0.3.0

Apple Quant's algorithmic library.
use crate::{
	instrument::{InstrumentData, InstrumentSpec},
	aggregation::TradeTradeTimestamp, timestamp::TradeTimestamped,
};

pub struct StdTrades<
	'instrument_data,
	IS: InstrumentSpec,
> {
	data: &'instrument_data [TradeTradeTimestamp<IS>],
}

impl<
	'instrument_data,
	IS: InstrumentSpec,
> StdTrades<'instrument_data, IS> {
	pub fn new(
		data: &'instrument_data [TradeTradeTimestamp<IS>],
	) -> Self {
		Self { data }
	}

	pub fn new_reaggregate<T: TradeTimestamped + 'instrument_data>(
		instrument_data: &'instrument_data InstrumentData<'instrument_data, '_, IS>,
		recent_aggregated_data_backward: impl Iterator<Item = &'instrument_data T>,
		count: usize,
	) -> Self {
		debug_assert!(count >= 1);

		let Some(
			aggregation,
		) = recent_aggregated_data_backward.skip(
			count - 1,
		).next() else {
			return Self {
				data: instrument_data.trades_forward_slice(),
			};
		};

		Self {
			data: instrument_data.reaggregate_trade_forward_slice(aggregation),
		}
	}

	pub fn new_aggregate<T: TradeTimestamped + 'instrument_data>(
		instrument_data: &'instrument_data InstrumentData<'instrument_data, '_, IS>,
	) -> Self {
		Self {
			data: instrument_data.trades_new_recent_forward_slice(),
		}
	}

	pub fn into_iter(
		self,
	) -> impl IntoIterator<Item = &'instrument_data TradeTradeTimestamp<IS>> {
		self.data
	}

	pub fn iter(
		&self,
	) -> impl Iterator<Item = &'instrument_data TradeTradeTimestamp<IS>> {
		self.data.iter()
	}
}