use alloc::vec::Vec;
use crate::batch::ProvenBatch;
use crate::transaction::OrderedTransactionHeaders;
use crate::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OrderedBatches(Vec<ProvenBatch>);
impl OrderedBatches {
pub(crate) fn new(batches: Vec<ProvenBatch>) -> Self {
Self(batches)
}
pub fn as_slice(&self) -> &[ProvenBatch] {
&self.0
}
pub fn to_transactions(&self) -> OrderedTransactionHeaders {
OrderedTransactionHeaders::new_unchecked(
self.0
.iter()
.flat_map(|batch| batch.transactions().as_slice().iter())
.cloned()
.collect(),
)
}
pub fn into_transactions(self) -> OrderedTransactionHeaders {
OrderedTransactionHeaders::new_unchecked(
self.0
.into_iter()
.flat_map(|batch| batch.into_transactions().into_vec().into_iter())
.collect(),
)
}
pub fn num_created_notes(&self) -> usize {
self.0.as_slice().iter().fold(0, |acc, batch| acc + batch.output_notes().len())
}
pub fn into_vec(self) -> Vec<ProvenBatch> {
self.0
}
}
impl Serializable for OrderedBatches {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
self.0.write_into(target)
}
}
impl Deserializable for OrderedBatches {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
source.read().map(OrderedBatches::new)
}
}