use crate::internal::{SerializeFn, WriteContext};
use crate::lib::std::io::Write;
pub fn all<G, W: Write, It>(values: It) -> impl SerializeFn<W>
where
G: SerializeFn<W>,
It: Clone + Iterator<Item = G>,
{
move |mut out: WriteContext<W>| {
let it = values.clone();
for v in it {
out = v(out)?;
}
Ok(out)
}
}
pub fn separated_list<F, G, W: Write, It>(sep: F, values: It) -> impl SerializeFn<W>
where
F: SerializeFn<W>,
G: SerializeFn<W>,
It: Clone + Iterator<Item = G>,
{
move |mut out: WriteContext<W>| {
let mut it = values.clone();
match it.next() {
None => return Ok(out),
Some(first) => {
out = first(out)?;
}
}
for v in it {
out = sep(out).and_then(v)?;
}
Ok(out)
}
}
pub fn many_ref<E, It, I, F, G, O: Write>(items: I, generator: F) -> impl SerializeFn<O>
where
It: Iterator<Item = E> + Clone,
I: IntoIterator<Item = E, IntoIter = It>,
F: Fn(E) -> G,
G: SerializeFn<O>,
{
let items = items.into_iter();
move |mut out: WriteContext<O>| {
for item in items.clone() {
out = generator(item)(out)?;
}
Ok(out)
}
}