use core::{
fmt,
marker::PhantomData,
ops::{ControlFlow, Deref},
};
use serde::{
de::{SeqAccess, Visitor},
Deserialize,
};
mod fold;
pub use fold::*;
mod try_fold;
pub use try_fold::*;
mod for_each;
pub use for_each::*;
mod find;
pub use find::*;
pub struct StreamSeqDeser<I: Aggregator> {
value: I::Value,
}
impl<I: Aggregator> Deref for StreamSeqDeser<I> {
type Target = I::Value;
fn deref(&self) -> &Self::Target {
&self.value
}
}
impl<I: Aggregator> StreamSeqDeser<I> {
pub fn value(&self) -> &I::Value {
&self.value
}
pub fn into_inner(self) -> I::Value {
self.value
}
}
pub trait Aggregator {
type Acc;
type Item;
type Break;
type Value;
fn init() -> Self::Acc;
fn try_fold(acc: Self::Acc, item: Self::Item) -> ControlFlow<Self::Break, Self::Acc>;
fn finalize(x: ControlFlow<Self::Break, Self::Acc>) -> Self::Value;
}
struct Vis<I> {
marker: PhantomData<I>,
}
impl<'de, I: Aggregator> Visitor<'de> for Vis<I>
where
I::Item: Deserialize<'de>,
{
type Value = I::Value;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a sequence")
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let mut acc = I::init();
let fin;
'outer: {
while let Some(value) = seq.next_element()? {
match I::try_fold(acc, value) {
ControlFlow::Continue(new_acc) => acc = new_acc,
ControlFlow::Break(clot_break) => {
while seq.next_element::<I::Item>()?.is_some() {}
fin = ControlFlow::Break(clot_break);
break 'outer;
}
}
}
fin = ControlFlow::Continue(acc)
}
Ok(I::finalize(fin))
}
}
impl<'de, I: Aggregator> Deserialize<'de> for StreamSeqDeser<I>
where
I::Item: Deserialize<'de>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let vis = Vis::<I> {
marker: PhantomData,
};
let fin = deserializer.deserialize_seq(vis)?;
Ok(Self { value: fin })
}
}