Add a fold equivalent of separated_list0/separated_list1
I wrote my own version of this for advent of code after I realized there wasn't a built-in way.
Essentially this is like separated_list0/separated_list1, but with an init and g parameter like fold_many0.
This makes it very flexible to parse separated lists and avoid needing to allocate, unless required.
My proposal would be to add a fold_separated_list0 and fold_separated_list1.
pub fn fold_separated_list0<I, O, O2, E, F, G, H, R, S>(
mut sep: S,
mut f: F,
mut init: H,
mut g: G,
) -> impl FnMut(I) -> IResult<I, R, E>
where
I: Clone + InputLength,
F: Parser<I, O, E>,
S: Parser<I, O2, E>,
E: ParseError<I>,
G: FnMut(R, O) -> R,
H: FnMut() -> R,
Essentially the code would be the same as separated_list0, except for the Vec::new() we call init(), and instead of Vec::push() we call g(). With these code changes, separated_list0 could be written in terms of fold_separated_list0. Just pass the appropriate Vec methods for init and g.
fold_separated_list1 would be based on separated_list1, with the same additional parameters.
Thoughts? Suggestions?