use super::{UniversalRead, UniversalWriteFileOps};
use crate::common::universal_io::{ByteOffset, FileIndex, Flusher, UioResult, UniversalIoError};
pub trait UniversalFlush {
fn flusher(&self) -> Flusher;
}
pub trait UniversalWrite: UniversalRead<Fs: UniversalWriteFileOps> + UniversalFlush {
fn write<T: bytemuck::Pod>(&mut self, byte_offset: ByteOffset, data: &[T]) -> UioResult<()>;
fn write_batch<'a, T: bytemuck::Pod>(
&mut self,
offset_data: impl IntoIterator<Item = (ByteOffset, &'a [T])>,
) -> UioResult<()>;
fn write_multi<'a, T: bytemuck::Pod>(
files: &mut [Self],
writes: impl IntoIterator<Item = (FileIndex, ByteOffset, &'a [T])>,
) -> UioResult<()> {
let files_len = files.len();
for (file_index, offset, data) in writes {
let file = files
.get_mut(file_index)
.ok_or(UniversalIoError::InvalidFileIndex {
file_index,
files: files_len,
})?;
file.write(offset, data)?;
}
Ok(())
}
}