use crate::{
Data, DataProvider, FinalizationHandler, Hasher, OrderedUnit, UnitFinalizationHandler,
};
use futures::{AsyncRead, AsyncWrite};
use std::marker::PhantomData;
pub struct FinalizationHandlerAdapter<FH, D, H> {
finalization_handler: FH,
_phantom: PhantomData<(D, H)>,
}
impl<FH, D, H> From<FH> for FinalizationHandlerAdapter<FH, D, H> {
fn from(value: FH) -> Self {
Self {
finalization_handler: value,
_phantom: PhantomData,
}
}
}
impl<D: Data, H: Hasher, FH: FinalizationHandler<D>> UnitFinalizationHandler
for FinalizationHandlerAdapter<FH, D, H>
{
type Data = D;
type Hasher = H;
fn batch_finalized(&mut self, batch: Vec<OrderedUnit<Self::Data, Self::Hasher>>) {
for unit in batch {
if let Some(data) = unit.data {
self.finalization_handler.data_finalized(data)
}
}
}
}
#[derive(Clone)]
pub struct LocalIO<DP: DataProvider, UFH: UnitFinalizationHandler, US: AsyncWrite, UL: AsyncRead> {
data_provider: DP,
finalization_handler: UFH,
unit_saver: US,
unit_loader: UL,
}
impl<
H: Hasher,
DP: DataProvider,
FH: FinalizationHandler<DP::Output>,
US: AsyncWrite,
UL: AsyncRead,
> LocalIO<DP, FinalizationHandlerAdapter<FH, DP::Output, H>, US, UL>
{
pub fn new(
data_provider: DP,
finalization_handler: FH,
unit_saver: US,
unit_loader: UL,
) -> Self {
Self {
data_provider,
finalization_handler: finalization_handler.into(),
unit_saver,
unit_loader,
}
}
}
impl<DP: DataProvider, UFH: UnitFinalizationHandler, US: AsyncWrite, UL: AsyncRead>
LocalIO<DP, UFH, US, UL>
{
pub fn new_with_unit_finalization_handler(
data_provider: DP,
finalization_handler: UFH,
unit_saver: US,
unit_loader: UL,
) -> Self {
Self {
data_provider,
finalization_handler,
unit_saver,
unit_loader,
}
}
pub fn into_components(self) -> (DP, UFH, US, UL) {
let LocalIO {
data_provider,
finalization_handler,
unit_saver,
unit_loader,
} = self;
(data_provider, finalization_handler, unit_saver, unit_loader)
}
}