winnow/combinator/multi.rs
1//! Combinators applying their child parser multiple times
2
3use crate::combinator::trace;
4use crate::error::FromExternalError;
5use crate::error::ParserError;
6use crate::stream::Accumulate;
7use crate::stream::Range;
8use crate::stream::Stream;
9use crate::Parser;
10use crate::Result;
11
12/// [`Accumulate`] the output of a parser into a container, like `Vec`
13///
14/// This stops before `n` when the parser returns [`ErrMode::Backtrack`][crate::error::ErrMode::Backtrack]. To instead chain an error up, see
15/// [`cut_err`][crate::combinator::cut_err].
16///
17/// To take a series of tokens, [`Accumulate`] into a `()`
18/// (e.g. with [`.map(|()| ())`][Parser::map])
19/// and then [`Parser::take`].
20///
21/// <div class="warning">
22///
23/// **Warning:** If the parser passed to `repeat` accepts empty inputs
24/// (like `alpha0` or `digit0`), `repeat` will return an error,
25/// to prevent going into an infinite loop.
26///
27/// </div>
28///
29/// # Example
30///
31/// Zero or more repetitions:
32/// ```rust
33/// # #[cfg(feature = "std")] {
34/// # use winnow::{error::ErrMode, error::Needed};
35/// # use winnow::prelude::*;
36/// use winnow::combinator::repeat;
37///
38/// fn parser<'i>(s: &mut &'i str) -> ModalResult<Vec<&'i str>> {
39/// repeat(0.., "abc").parse_next(s)
40/// }
41///
42/// assert_eq!(parser.parse_peek("abcabc"), Ok(("", vec!["abc", "abc"])));
43/// assert_eq!(parser.parse_peek("abc123"), Ok(("123", vec!["abc"])));
44/// assert_eq!(parser.parse_peek("123123"), Ok(("123123", vec![])));
45/// assert_eq!(parser.parse_peek(""), Ok(("", vec![])));
46/// # }
47/// ```
48///
49/// One or more repetitions:
50/// ```rust
51/// # #[cfg(feature = "std")] {
52/// # use winnow::{error::ErrMode, error::Needed};
53/// # use winnow::prelude::*;
54/// use winnow::combinator::repeat;
55///
56/// fn parser<'i>(s: &mut &'i str) -> ModalResult<Vec<&'i str>> {
57/// repeat(1.., "abc").parse_next(s)
58/// }
59///
60/// assert_eq!(parser.parse_peek("abcabc"), Ok(("", vec!["abc", "abc"])));
61/// assert_eq!(parser.parse_peek("abc123"), Ok(("123", vec!["abc"])));
62/// assert!(parser.parse_peek("123123").is_err());
63/// assert!(parser.parse_peek("").is_err());
64/// # }
65/// ```
66///
67/// Fixed number of repetitions:
68/// ```rust
69/// # #[cfg(feature = "std")] {
70/// # use winnow::{error::ErrMode, error::Needed};
71/// # use winnow::prelude::*;
72/// use winnow::combinator::repeat;
73///
74/// fn parser<'i>(s: &mut &'i str) -> ModalResult<Vec<&'i str>> {
75/// repeat(2, "abc").parse_next(s)
76/// }
77///
78/// assert_eq!(parser.parse_peek("abcabc"), Ok(("", vec!["abc", "abc"])));
79/// assert!(parser.parse_peek("abc123").is_err());
80/// assert!(parser.parse_peek("123123").is_err());
81/// assert!(parser.parse_peek("").is_err());
82/// assert_eq!(parser.parse_peek("abcabcabc"), Ok(("abc", vec!["abc", "abc"])));
83/// # }
84/// ```
85///
86/// Arbitrary repetitions:
87/// ```rust
88/// # #[cfg(feature = "std")] {
89/// # use winnow::{error::ErrMode, error::Needed};
90/// # use winnow::prelude::*;
91/// use winnow::combinator::repeat;
92///
93/// fn parser<'i>(s: &mut &'i str) -> ModalResult<Vec<&'i str>> {
94/// repeat(0..=2, "abc").parse_next(s)
95/// }
96///
97/// assert_eq!(parser.parse_peek("abcabc"), Ok(("", vec!["abc", "abc"])));
98/// assert_eq!(parser.parse_peek("abc123"), Ok(("123", vec!["abc"])));
99/// assert_eq!(parser.parse_peek("123123"), Ok(("123123", vec![])));
100/// assert_eq!(parser.parse_peek(""), Ok(("", vec![])));
101/// assert_eq!(parser.parse_peek("abcabcabc"), Ok(("abc", vec!["abc", "abc"])));
102/// # }
103/// ```
104#[doc(alias = "many0")]
105#[doc(alias = "count")]
106#[doc(alias = "many0_count")]
107#[doc(alias = "many1")]
108#[doc(alias = "many1_count")]
109#[doc(alias = "many_m_n")]
110#[doc(alias = "repeated")]
111#[doc(alias = "skip_many")]
112#[doc(alias = "skip_many1")]
113#[inline(always)]
114pub fn repeat<Input, Output, Accumulator, Error, ParseNext>(
115 occurrences: impl Into<Range>,
116 parser: ParseNext,
117) -> Repeat<ParseNext, Input, Output, Accumulator, Error>
118where
119 Input: Stream,
120 Accumulator: Accumulate<Output>,
121 ParseNext: Parser<Input, Output, Error>,
122 Error: ParserError<Input>,
123{
124 Repeat {
125 occurrences: occurrences.into(),
126 parser,
127 i: Default::default(),
128 o: Default::default(),
129 c: Default::default(),
130 e: Default::default(),
131 }
132}
133
134/// Customizable [`Parser`] implementation for [`repeat`]
135pub struct Repeat<P, I, O, C, E>
136where
137 P: Parser<I, O, E>,
138 I: Stream,
139 C: Accumulate<O>,
140 E: ParserError<I>,
141{
142 occurrences: Range,
143 parser: P,
144 i: core::marker::PhantomData<I>,
145 o: core::marker::PhantomData<O>,
146 c: core::marker::PhantomData<C>,
147 e: core::marker::PhantomData<E>,
148}
149
150impl<ParseNext, Input, Output, Error> Repeat<ParseNext, Input, Output, (), Error>
151where
152 ParseNext: Parser<Input, Output, Error>,
153 Input: Stream,
154 Error: ParserError<Input>,
155{
156 /// Repeats the embedded parser, calling `op` to gather the results
157 ///
158 /// This stops before `n` when the parser returns [`ErrMode::Backtrack`][crate::error::ErrMode::Backtrack]. To instead chain an error up, see
159 /// [`cut_err`][crate::combinator::cut_err].
160 ///
161 /// # Arguments
162 /// * `init` A function returning the initial value.
163 /// * `op` The function that combines a result of `f` with
164 /// the current accumulator.
165 ///
166 /// <div class="warning">
167 ///
168 /// **Warning:** If the parser passed to [`repeat`] accepts empty inputs
169 /// (like `alpha0` or `digit0`), `fold` will return an error,
170 /// to prevent going into an infinite loop.
171 ///
172 /// </div>
173 ///
174 /// # Example
175 ///
176 /// Zero or more repetitions:
177 /// ```rust
178 /// # use winnow::{error::ErrMode, error::Needed};
179 /// # use winnow::prelude::*;
180 /// use winnow::combinator::repeat;
181 ///
182 /// fn parser<'i>(s: &mut &'i str) -> ModalResult<Vec<&'i str>> {
183 /// repeat(
184 /// 0..,
185 /// "abc"
186 /// ).fold(
187 /// Vec::new,
188 /// |mut acc: Vec<_>, item| {
189 /// acc.push(item);
190 /// acc
191 /// }
192 /// ).parse_next(s)
193 /// }
194 ///
195 /// assert_eq!(parser.parse_peek("abcabc"), Ok(("", vec!["abc", "abc"])));
196 /// assert_eq!(parser.parse_peek("abc123"), Ok(("123", vec!["abc"])));
197 /// assert_eq!(parser.parse_peek("123123"), Ok(("123123", vec![])));
198 /// assert_eq!(parser.parse_peek(""), Ok(("", vec![])));
199 /// ```
200 ///
201 /// One or more repetitions:
202 /// ```rust
203 /// # use winnow::{error::ErrMode, error::Needed};
204 /// # use winnow::prelude::*;
205 /// use winnow::combinator::repeat;
206 ///
207 /// fn parser<'i>(s: &mut &'i str) -> ModalResult<Vec<&'i str>> {
208 /// repeat(
209 /// 1..,
210 /// "abc",
211 /// ).fold(
212 /// Vec::new,
213 /// |mut acc: Vec<_>, item| {
214 /// acc.push(item);
215 /// acc
216 /// }
217 /// ).parse_next(s)
218 /// }
219 ///
220 /// assert_eq!(parser.parse_peek("abcabc"), Ok(("", vec!["abc", "abc"])));
221 /// assert_eq!(parser.parse_peek("abc123"), Ok(("123", vec!["abc"])));
222 /// assert!(parser.parse_peek("123123").is_err());
223 /// assert!(parser.parse_peek("").is_err());
224 /// ```
225 ///
226 /// Arbitrary number of repetitions:
227 /// ```rust
228 /// # use winnow::{error::ErrMode, error::Needed};
229 /// # use winnow::prelude::*;
230 /// use winnow::combinator::repeat;
231 ///
232 /// fn parser<'i>(s: &mut &'i str) -> ModalResult<Vec<&'i str>> {
233 /// repeat(
234 /// 0..=2,
235 /// "abc",
236 /// ).fold(
237 /// Vec::new,
238 /// |mut acc: Vec<_>, item| {
239 /// acc.push(item);
240 /// acc
241 /// }
242 /// ).parse_next(s)
243 /// }
244 ///
245 /// assert_eq!(parser.parse_peek("abcabc"), Ok(("", vec!["abc", "abc"])));
246 /// assert_eq!(parser.parse_peek("abc123"), Ok(("123", vec!["abc"])));
247 /// assert_eq!(parser.parse_peek("123123"), Ok(("123123", vec![])));
248 /// assert_eq!(parser.parse_peek(""), Ok(("", vec![])));
249 /// assert_eq!(parser.parse_peek("abcabcabc"), Ok(("abc", vec!["abc", "abc"])));
250 /// ```
251 #[doc(alias = "fold_many0")]
252 #[doc(alias = "fold_many1")]
253 #[doc(alias = "fold_many_m_n")]
254 #[doc(alias = "fold_repeat")]
255 #[inline(always)]
256 pub fn fold<Init, Op, Result>(
257 mut self,
258 mut init: Init,
259 mut op: Op,
260 ) -> impl Parser<Input, Result, Error>
261 where
262 Init: FnMut() -> Result,
263 Op: FnMut(Result, Output) -> Result,
264 {
265 let Range {
266 start_inclusive,
267 end_inclusive,
268 } = self.occurrences;
269 trace("repeat_fold", move |i: &mut Input| {
270 match (start_inclusive, end_inclusive) {
271 (0, None) => fold_repeat0_(&mut self.parser, &mut init, &mut op, i),
272 (1, None) => fold_repeat1_(&mut self.parser, &mut init, &mut op, i),
273 (start, end) if Some(start) == end => {
274 fold_repeat_n_(start, &mut self.parser, &mut init, &mut op, i)
275 }
276 (start, end) => fold_repeat_m_n_(
277 start,
278 end.unwrap_or(usize::MAX),
279 &mut self.parser,
280 &mut init,
281 &mut op,
282 i,
283 ),
284 }
285 })
286 }
287
288 /// Akin to [`Repeat::fold`], but for containers that can reject an element.
289 ///
290 /// This stops before `n` when the parser returns [`ErrMode::Backtrack`][crate::error::ErrMode::Backtrack]. To instead chain an error up, see
291 /// [`cut_err`][crate::combinator::cut_err]. Additionally, if the fold function returns `None`, the parser will
292 /// stop and return an error.
293 ///
294 /// # Arguments
295 /// * `init` A function returning the initial value.
296 /// * `op` The function that combines a result of `f` with
297 /// the current accumulator.
298 ///
299 /// <div class="warning">
300 ///
301 /// **Warning:** If the parser passed to [`repeat`] accepts empty inputs
302 /// (like `alpha0` or `digit0`), `verify_fold` will return an error,
303 /// to prevent going into an infinite loop.
304 ///
305 /// </div>
306 ///
307 /// # Example
308 ///
309 /// Guaranteeing that the input had unique elements:
310 /// ```rust
311 /// # use winnow::{error::ErrMode, error::Needed};
312 /// # use winnow::prelude::*;
313 /// use winnow::combinator::repeat;
314 /// use std::collections::HashSet;
315 ///
316 /// fn parser<'i>(s: &mut &'i str) -> ModalResult<HashSet<&'i str>> {
317 /// repeat(
318 /// 0..,
319 /// "abc"
320 /// ).verify_fold(
321 /// HashSet::new,
322 /// |mut acc: HashSet<_>, item| {
323 /// if acc.insert(item) {
324 /// Some(acc)
325 /// } else {
326 /// None
327 /// }
328 /// }
329 /// ).parse_next(s)
330 /// }
331 ///
332 /// assert_eq!(parser.parse_peek("abc"), Ok(("", HashSet::from(["abc"]))));
333 /// assert!(parser.parse_peek("abcabc").is_err());
334 /// assert_eq!(parser.parse_peek("abc123"), Ok(("123", HashSet::from(["abc"]))));
335 /// assert_eq!(parser.parse_peek("123123"), Ok(("123123", HashSet::from([]))));
336 /// assert_eq!(parser.parse_peek(""), Ok(("", HashSet::from([]))));
337 /// ```
338 #[inline(always)]
339 pub fn verify_fold<Init, Op, Result>(
340 mut self,
341 mut init: Init,
342 mut op: Op,
343 ) -> impl Parser<Input, Result, Error>
344 where
345 Init: FnMut() -> Result,
346 Op: FnMut(Result, Output) -> Option<Result>,
347 {
348 let Range {
349 start_inclusive,
350 end_inclusive,
351 } = self.occurrences;
352 trace("repeat_verify_fold", move |input: &mut Input| {
353 verify_fold_m_n(
354 start_inclusive,
355 end_inclusive.unwrap_or(usize::MAX),
356 &mut self.parser,
357 &mut init,
358 &mut op,
359 input,
360 )
361 })
362 }
363
364 /// Akin to [`Repeat::fold`], but for containers that can error when an element is accumulated.
365 ///
366 /// This stops before `n` when the parser returns [`ErrMode::Backtrack`][crate::error::ErrMode::Backtrack]. To instead chain an error up, see
367 /// [`cut_err`][crate::combinator::cut_err]. Additionally, if the fold function returns an error, the parser will
368 /// stop and return it.
369 ///
370 /// # Arguments
371 /// * `init` A function returning the initial value.
372 /// * `op` The function that combines a result of `f` with
373 /// the current accumulator.
374 ///
375 /// <div class="warning">
376 ///
377 /// **Warning:** If the parser passed to [`repeat`] accepts empty inputs
378 /// (like `alpha0` or `digit0`), `try_fold` will return an error,
379 /// to prevent going into an infinite loop.
380 ///
381 /// </div>
382 ///
383 /// # Example
384 ///
385 /// Writing the output to a vector of bytes:
386 /// ```rust
387 /// # use winnow::{error::ErrMode, error::Needed};
388 /// # use winnow::prelude::*;
389 /// use winnow::combinator::repeat;
390 /// use std::io::Write;
391 /// use std::io::Error;
392 ///
393 /// fn parser(s: &mut &str) -> ModalResult<Vec<u8>> {
394 /// repeat(
395 /// 0..,
396 /// "abc"
397 /// ).try_fold(
398 /// Vec::new,
399 /// |mut acc, item: &str| -> Result<_, Error> {
400 /// acc.write(item.as_bytes())?;
401 /// Ok(acc)
402 /// }
403 /// ).parse_next(s)
404 /// }
405 ///
406 /// assert_eq!(parser.parse_peek("abc"), Ok(("", b"abc".to_vec())));
407 /// assert_eq!(parser.parse_peek("abc123"), Ok(("123", b"abc".to_vec())));
408 /// assert_eq!(parser.parse_peek("123123"), Ok(("123123", vec![])));
409 /// assert_eq!(parser.parse_peek(""), Ok(("", vec![])));
410 #[inline(always)]
411 pub fn try_fold<Init, Op, OpError, Result>(
412 mut self,
413 mut init: Init,
414 mut op: Op,
415 ) -> impl Parser<Input, Result, Error>
416 where
417 Init: FnMut() -> Result,
418 Op: FnMut(Result, Output) -> core::result::Result<Result, OpError>,
419 Error: FromExternalError<Input, OpError>,
420 {
421 let Range {
422 start_inclusive,
423 end_inclusive,
424 } = self.occurrences;
425 trace("repeat_try_fold", move |input: &mut Input| {
426 try_fold_m_n(
427 start_inclusive,
428 end_inclusive.unwrap_or(usize::MAX),
429 &mut self.parser,
430 &mut init,
431 &mut op,
432 input,
433 )
434 })
435 }
436}
437
438impl<P, I, O, C, E> Parser<I, C, E> for Repeat<P, I, O, C, E>
439where
440 P: Parser<I, O, E>,
441 I: Stream,
442 C: Accumulate<O>,
443 E: ParserError<I>,
444{
445 #[inline(always)]
446 fn parse_next(&mut self, i: &mut I) -> Result<C, E> {
447 let Range {
448 start_inclusive,
449 end_inclusive,
450 } = self.occurrences;
451 trace("repeat", move |i: &mut I| {
452 match (start_inclusive, end_inclusive) {
453 (0, None) => fold_repeat0_(
454 &mut self.parser,
455 &mut || C::initial(None),
456 &mut |mut acc, o| {
457 acc.accumulate(o);
458 acc
459 },
460 i,
461 ),
462 (1, None) => fold_repeat1_(
463 &mut self.parser,
464 &mut || C::initial(None),
465 &mut |mut acc, o| {
466 acc.accumulate(o);
467 acc
468 },
469 i,
470 ),
471 (min, end) if Some(min) == end => fold_repeat_n_(
472 min,
473 &mut self.parser,
474 &mut || C::initial(Some(min)),
475 &mut |mut acc, o| {
476 acc.accumulate(o);
477 acc
478 },
479 i,
480 ),
481 (min, end) => fold_repeat_m_n_(
482 min,
483 end.unwrap_or(usize::MAX),
484 &mut self.parser,
485 &mut || C::initial(Some(min)),
486 &mut |mut acc, o| {
487 acc.accumulate(o);
488 acc
489 },
490 i,
491 ),
492 }
493 })
494 .parse_next(i)
495 }
496}
497
498fn fold_repeat0_<I, O, E, P, N, F, R>(
499 parser: &mut P,
500 init: &mut N,
501 fold: &mut F,
502 input: &mut I,
503) -> Result<R, E>
504where
505 I: Stream,
506 P: Parser<I, O, E>,
507 N: FnMut() -> R,
508 F: FnMut(R, O) -> R,
509 E: ParserError<I>,
510{
511 let mut res = init();
512
513 loop {
514 let start = input.checkpoint();
515 let len = input.eof_offset();
516 match parser.parse_next(input) {
517 Ok(output) => {
518 // infinite loop check: the parser must always consume
519 if input.eof_offset() == len {
520 return Err(ParserError::assert(
521 input,
522 "`repeat` parsers must always consume",
523 ));
524 }
525
526 res = fold(res, output);
527 }
528 Err(err) if err.is_backtrack() => {
529 input.reset(&start);
530 return Ok(res);
531 }
532 Err(err) => {
533 return Err(err);
534 }
535 }
536 }
537}
538
539fn fold_repeat1_<I, O, E, P, N, F, R>(
540 parser: &mut P,
541 init: &mut N,
542 fold: &mut F,
543 input: &mut I,
544) -> Result<R, E>
545where
546 I: Stream,
547 P: Parser<I, O, E>,
548 N: FnMut() -> R,
549 F: FnMut(R, O) -> R,
550 E: ParserError<I>,
551{
552 let start = input.checkpoint();
553 match parser.parse_next(input) {
554 Err(err) => Err(err.append(input, &start)),
555 Ok(output) => {
556 let init = init();
557 let mut res = fold(init, output);
558
559 loop {
560 let start = input.checkpoint();
561 let len = input.eof_offset();
562 match parser.parse_next(input) {
563 Err(err) if err.is_backtrack() => {
564 input.reset(&start);
565 break;
566 }
567 Err(err) => return Err(err),
568 Ok(output) => {
569 // infinite loop check: the parser must always consume
570 if input.eof_offset() == len {
571 return Err(ParserError::assert(
572 input,
573 "`repeat` parsers must always consume",
574 ));
575 }
576
577 res = fold(res, output);
578 }
579 }
580 }
581
582 Ok(res)
583 }
584 }
585}
586
587fn fold_repeat_n_<I, O, E, P, N, F, R>(
588 count: usize,
589 parse: &mut P,
590 init: &mut N,
591 fold: &mut F,
592 input: &mut I,
593) -> Result<R, E>
594where
595 I: Stream,
596 P: Parser<I, O, E>,
597 N: FnMut() -> R,
598 F: FnMut(R, O) -> R,
599 E: ParserError<I>,
600{
601 let mut res = init();
602
603 for _ in 0..count {
604 let start = input.checkpoint();
605 let len = input.eof_offset();
606 match parse.parse_next(input) {
607 Ok(output) => {
608 // infinite loop check: the parser must always consume
609 if input.eof_offset() == len {
610 return Err(ParserError::assert(
611 input,
612 "`repeat` parsers must always consume",
613 ));
614 }
615
616 res = fold(res, output);
617 }
618 Err(err) => {
619 return Err(err.append(input, &start));
620 }
621 }
622 }
623
624 Ok(res)
625}
626
627fn fold_repeat_m_n_<I, O, E, P, N, F, R>(
628 min: usize,
629 max: usize,
630 parse: &mut P,
631 init: &mut N,
632 fold: &mut F,
633 input: &mut I,
634) -> Result<R, E>
635where
636 I: Stream,
637 P: Parser<I, O, E>,
638 N: FnMut() -> R,
639 F: FnMut(R, O) -> R,
640 E: ParserError<I>,
641{
642 if min > max {
643 return Err(ParserError::assert(
644 input,
645 "range should be ascending, rather than descending",
646 ));
647 }
648
649 let mut res = init();
650 for count in 0..max {
651 let start = input.checkpoint();
652 let len = input.eof_offset();
653 match parse.parse_next(input) {
654 Ok(output) => {
655 // infinite loop check: the parser must always consume
656 if input.eof_offset() == len {
657 return Err(ParserError::assert(
658 input,
659 "`repeat` parsers must always consume",
660 ));
661 }
662
663 res = fold(res, output);
664 }
665 //FInputXMError: handle failure properly
666 Err(err) if err.is_backtrack() => {
667 if count < min {
668 return Err(err.append(input, &start));
669 } else {
670 input.reset(&start);
671 break;
672 }
673 }
674 Err(err) => return Err(err),
675 }
676 }
677
678 Ok(res)
679}
680
681fn verify_fold_m_n<I, O, E, P, N, F, R>(
682 min: usize,
683 max: usize,
684 parse: &mut P,
685 init: &mut N,
686 fold: &mut F,
687 input: &mut I,
688) -> Result<R, E>
689where
690 I: Stream,
691 P: Parser<I, O, E>,
692 N: FnMut() -> R,
693 F: FnMut(R, O) -> Option<R>,
694 E: ParserError<I>,
695{
696 if min > max {
697 return Err(ParserError::assert(
698 input,
699 "range should be ascending, rather than descending",
700 ));
701 }
702
703 let mut res = init();
704 for count in 0..max {
705 let start = input.checkpoint();
706 let len = input.eof_offset();
707 match parse.parse_next(input) {
708 Ok(output) => {
709 // infinite loop check: the parser must always consume
710 if input.eof_offset() == len {
711 return Err(ParserError::assert(
712 input,
713 "`repeat` parsers must always consume",
714 ));
715 }
716
717 let Some(res_) = fold(res, output) else {
718 input.reset(&start);
719 let res = Err(ParserError::from_input(input));
720 super::debug::trace_result("verify_fold", &res);
721 return res;
722 };
723 res = res_;
724 }
725 //FInputXMError: handle failure properly
726 Err(err) if err.is_backtrack() => {
727 if count < min {
728 return Err(err.append(input, &start));
729 } else {
730 input.reset(&start);
731 break;
732 }
733 }
734 Err(err) => return Err(err),
735 }
736 }
737
738 Ok(res)
739}
740
741fn try_fold_m_n<I, O, E, P, N, F, R, RE>(
742 min: usize,
743 max: usize,
744 parse: &mut P,
745 init: &mut N,
746 fold: &mut F,
747 input: &mut I,
748) -> Result<R, E>
749where
750 I: Stream,
751 P: Parser<I, O, E>,
752 N: FnMut() -> R,
753 F: FnMut(R, O) -> Result<R, RE>,
754 E: ParserError<I> + FromExternalError<I, RE>,
755{
756 if min > max {
757 return Err(ParserError::assert(
758 input,
759 "range should be ascending, rather than descending",
760 ));
761 }
762
763 let mut res = init();
764 for count in 0..max {
765 let start = input.checkpoint();
766 let len = input.eof_offset();
767 match parse.parse_next(input) {
768 Ok(output) => {
769 // infinite loop check: the parser must always consume
770 if input.eof_offset() == len {
771 return Err(ParserError::assert(
772 input,
773 "`repeat` parsers must always consume",
774 ));
775 }
776
777 match fold(res, output) {
778 Ok(res_) => res = res_,
779 Err(err) => {
780 input.reset(&start);
781 let res = Err(E::from_external_error(input, err));
782 super::debug::trace_result("try_fold", &res);
783 return res;
784 }
785 }
786 }
787 //FInputXMError: handle failure properly
788 Err(err) if err.is_backtrack() => {
789 if count < min {
790 return Err(err.append(input, &start));
791 } else {
792 input.reset(&start);
793 break;
794 }
795 }
796 Err(err) => return Err(err),
797 }
798 }
799
800 Ok(res)
801}
802
803/// [`Accumulate`] the output of parser `f` into a container, like `Vec`, until the parser `g`
804/// produces a result.
805///
806/// Returns a tuple of the results of `f` in a `Vec` and the result of `g`.
807///
808/// `f` keeps going so long as `g` produces [`ErrMode::Backtrack`][crate::error::ErrMode::Backtrack]. To instead chain an error up, see [`cut_err`][crate::combinator::cut_err].
809///
810/// To take a series of tokens, [`Accumulate`] into a `()`
811/// (e.g. with [`.map(|((), _)| ())`][Parser::map])
812/// and then [`Parser::take`].
813///
814/// See also
815/// - [`take_till`][crate::token::take_till] for recognizing up-to a member of a [set of tokens][crate::stream::ContainsToken]
816/// - [`take_until`][crate::token::take_until] for recognizing up-to a [`literal`][crate::token::literal] (w/ optional simd optimizations)
817///
818/// # Example
819///
820/// ```rust
821/// # #[cfg(feature = "std")] {
822/// # use winnow::{error::ErrMode, error::Needed};
823/// # use winnow::prelude::*;
824/// use winnow::combinator::repeat_till;
825///
826/// fn parser<'i>(s: &mut &'i str) -> ModalResult<(Vec<&'i str>, &'i str)> {
827/// repeat_till(0.., "abc", "end").parse_next(s)
828/// };
829///
830/// assert_eq!(parser.parse_peek("abcabcend"), Ok(("", (vec!["abc", "abc"], "end"))));
831/// assert!(parser.parse_peek("abc123end").is_err());
832/// assert!(parser.parse_peek("123123end").is_err());
833/// assert!(parser.parse_peek("").is_err());
834/// assert_eq!(parser.parse_peek("abcendefg"), Ok(("efg", (vec!["abc"], "end"))));
835/// # }
836/// ```
837#[doc(alias = "many_till0")]
838pub fn repeat_till<Input, Output, Accumulator, Terminator, Error, ParseNext, TerminatorParser>(
839 occurrences: impl Into<Range>,
840 mut parse: ParseNext,
841 mut terminator: TerminatorParser,
842) -> impl Parser<Input, (Accumulator, Terminator), Error>
843where
844 Input: Stream,
845 Accumulator: Accumulate<Output>,
846 ParseNext: Parser<Input, Output, Error>,
847 TerminatorParser: Parser<Input, Terminator, Error>,
848 Error: ParserError<Input>,
849{
850 let Range {
851 start_inclusive,
852 end_inclusive,
853 } = occurrences.into();
854 trace("repeat_till", move |i: &mut Input| {
855 match (start_inclusive, end_inclusive) {
856 (0, None) => repeat_till0_(&mut parse, &mut terminator, i),
857 (start, end) => repeat_till_m_n_(
858 start,
859 end.unwrap_or(usize::MAX),
860 &mut parse,
861 &mut terminator,
862 i,
863 ),
864 }
865 })
866}
867
868fn repeat_till0_<I, O, C, P, E, F, G>(f: &mut F, g: &mut G, i: &mut I) -> Result<(C, P), E>
869where
870 I: Stream,
871 C: Accumulate<O>,
872 F: Parser<I, O, E>,
873 G: Parser<I, P, E>,
874 E: ParserError<I>,
875{
876 let mut res = C::initial(None);
877 loop {
878 let start = i.checkpoint();
879 let len = i.eof_offset();
880 match g.parse_next(i) {
881 Ok(o) => return Ok((res, o)),
882 Err(e) if e.is_backtrack() => {
883 i.reset(&start);
884 match f.parse_next(i) {
885 Err(e) => return Err(e.append(i, &start)),
886 Ok(o) => {
887 // infinite loop check: the parser must always consume
888 if i.eof_offset() == len {
889 return Err(ParserError::assert(
890 i,
891 "`repeat` parsers must always consume",
892 ));
893 }
894
895 res.accumulate(o);
896 }
897 }
898 }
899 Err(e) => return Err(e),
900 }
901 }
902}
903
904fn repeat_till_m_n_<I, O, C, P, E, F, G>(
905 min: usize,
906 max: usize,
907 f: &mut F,
908 g: &mut G,
909 i: &mut I,
910) -> Result<(C, P), E>
911where
912 I: Stream,
913 C: Accumulate<O>,
914 F: Parser<I, O, E>,
915 G: Parser<I, P, E>,
916 E: ParserError<I>,
917{
918 if min > max {
919 return Err(ParserError::assert(
920 i,
921 "range should be ascending, rather than descending",
922 ));
923 }
924
925 let mut res = C::initial(Some(min));
926
927 let start = i.checkpoint();
928 for _ in 0..min {
929 match f.parse_next(i) {
930 Ok(o) => {
931 res.accumulate(o);
932 }
933 Err(e) => {
934 return Err(e.append(i, &start));
935 }
936 }
937 }
938 for count in min..=max {
939 let start = i.checkpoint();
940 let len = i.eof_offset();
941 match g.parse_next(i) {
942 Ok(o) => return Ok((res, o)),
943 Err(err) if err.is_backtrack() => {
944 if count == max {
945 return Err(err);
946 }
947 i.reset(&start);
948 match f.parse_next(i) {
949 Err(e) => {
950 return Err(e.append(i, &start));
951 }
952 Ok(o) => {
953 // infinite loop check: the parser must always consume
954 if i.eof_offset() == len {
955 return Err(ParserError::assert(
956 i,
957 "`repeat` parsers must always consume",
958 ));
959 }
960
961 res.accumulate(o);
962 }
963 }
964 }
965 Err(e) => return Err(e),
966 }
967 }
968 unreachable!()
969}
970
971/// [`Accumulate`] the output of a parser, interleaved with `sep`
972///
973/// This stops when either parser returns [`ErrMode::Backtrack`][crate::error::ErrMode::Backtrack]. To instead chain an error up, see
974/// [`cut_err`][crate::combinator::cut_err].
975///
976/// To take a series of tokens, [`Accumulate`] into a `()`
977/// (e.g. with [`.map(|()| ())`][Parser::map])
978/// and then [`Parser::take`].
979///
980/// <div class="warning">
981///
982/// **Warning:** If the separator parser accepts empty inputs
983/// (like `alpha0` or `digit0`), `separated` will return an error,
984/// to prevent going into an infinite loop.
985///
986/// </div>
987///
988/// # Example
989///
990/// Zero or more repetitions:
991/// ```rust
992/// # #[cfg(feature = "std")] {
993/// # use winnow::{error::ErrMode, error::Needed};
994/// # use winnow::prelude::*;
995/// use winnow::combinator::separated;
996///
997/// fn parser<'i>(s: &mut &'i str) -> ModalResult<Vec<&'i str>> {
998/// separated(0.., "abc", "|").parse_next(s)
999/// }
1000///
1001/// assert_eq!(parser.parse_peek("abc|abc|abc"), Ok(("", vec!["abc", "abc", "abc"])));
1002/// assert_eq!(parser.parse_peek("abc123abc"), Ok(("123abc", vec!["abc"])));
1003/// assert_eq!(parser.parse_peek("abc|def"), Ok(("|def", vec!["abc"])));
1004/// assert_eq!(parser.parse_peek(""), Ok(("", vec![])));
1005/// assert_eq!(parser.parse_peek("def|abc"), Ok(("def|abc", vec![])));
1006/// # }
1007/// ```
1008///
1009/// One or more repetitions:
1010/// ```rust
1011/// # #[cfg(feature = "std")] {
1012/// # use winnow::{error::ErrMode, error::Needed};
1013/// # use winnow::prelude::*;
1014/// use winnow::combinator::separated;
1015///
1016/// fn parser<'i>(s: &mut &'i str) -> ModalResult<Vec<&'i str>> {
1017/// separated(1.., "abc", "|").parse_next(s)
1018/// }
1019///
1020/// assert_eq!(parser.parse_peek("abc|abc|abc"), Ok(("", vec!["abc", "abc", "abc"])));
1021/// assert_eq!(parser.parse_peek("abc123abc"), Ok(("123abc", vec!["abc"])));
1022/// assert_eq!(parser.parse_peek("abc|def"), Ok(("|def", vec!["abc"])));
1023/// assert!(parser.parse_peek("").is_err());
1024/// assert!(parser.parse_peek("def|abc").is_err());
1025/// # }
1026/// ```
1027///
1028/// Fixed number of repetitions:
1029/// ```rust
1030/// # #[cfg(feature = "std")] {
1031/// # use winnow::{error::ErrMode, error::Needed};
1032/// # use winnow::prelude::*;
1033/// use winnow::combinator::separated;
1034///
1035/// fn parser<'i>(s: &mut &'i str) -> ModalResult<Vec<&'i str>> {
1036/// separated(2, "abc", "|").parse_next(s)
1037/// }
1038///
1039/// assert_eq!(parser.parse_peek("abc|abc|abc"), Ok(("|abc", vec!["abc", "abc"])));
1040/// assert!(parser.parse_peek("abc123abc").is_err());
1041/// assert!(parser.parse_peek("abc|def").is_err());
1042/// assert!(parser.parse_peek("").is_err());
1043/// assert!(parser.parse_peek("def|abc").is_err());
1044/// # }
1045/// ```
1046///
1047/// Arbitrary repetitions:
1048/// ```rust
1049/// # #[cfg(feature = "std")] {
1050/// # use winnow::{error::ErrMode, error::Needed};
1051/// # use winnow::prelude::*;
1052/// use winnow::combinator::separated;
1053///
1054/// fn parser<'i>(s: &mut &'i str) -> ModalResult<Vec<&'i str>> {
1055/// separated(0..=2, "abc", "|").parse_next(s)
1056/// }
1057///
1058/// assert_eq!(parser.parse_peek("abc|abc|abc"), Ok(("|abc", vec!["abc", "abc"])));
1059/// assert_eq!(parser.parse_peek("abc123abc"), Ok(("123abc", vec!["abc"])));
1060/// assert_eq!(parser.parse_peek("abc|def"), Ok(("|def", vec!["abc"])));
1061/// assert_eq!(parser.parse_peek(""), Ok(("", vec![])));
1062/// assert_eq!(parser.parse_peek("def|abc"), Ok(("def|abc", vec![])));
1063/// # }
1064/// ```
1065#[doc(alias = "sep_by")]
1066#[doc(alias = "sep_by1")]
1067#[doc(alias = "separated_list0")]
1068#[doc(alias = "separated_list1")]
1069#[doc(alias = "separated_m_n")]
1070#[inline(always)]
1071pub fn separated<Input, Output, Accumulator, Sep, Error, ParseNext, SepParser>(
1072 occurrences: impl Into<Range>,
1073 mut parser: ParseNext,
1074 mut separator: SepParser,
1075) -> impl Parser<Input, Accumulator, Error>
1076where
1077 Input: Stream,
1078 Accumulator: Accumulate<Output>,
1079 ParseNext: Parser<Input, Output, Error>,
1080 SepParser: Parser<Input, Sep, Error>,
1081 Error: ParserError<Input>,
1082{
1083 let Range {
1084 start_inclusive,
1085 end_inclusive,
1086 } = occurrences.into();
1087 trace("separated", move |input: &mut Input| {
1088 match (start_inclusive, end_inclusive) {
1089 (0, None) => separated0_(&mut parser, &mut separator, input),
1090 (1, None) => separated1_(&mut parser, &mut separator, input),
1091 (start, end) if Some(start) == end => {
1092 separated_n_(start, &mut parser, &mut separator, input)
1093 }
1094 (start, end) => separated_m_n_(
1095 start,
1096 end.unwrap_or(usize::MAX),
1097 &mut parser,
1098 &mut separator,
1099 input,
1100 ),
1101 }
1102 })
1103}
1104
1105fn separated0_<I, O, C, O2, E, P, S>(
1106 parser: &mut P,
1107 separator: &mut S,
1108 input: &mut I,
1109) -> Result<C, E>
1110where
1111 I: Stream,
1112 C: Accumulate<O>,
1113 P: Parser<I, O, E>,
1114 S: Parser<I, O2, E>,
1115 E: ParserError<I>,
1116{
1117 let mut acc = C::initial(None);
1118
1119 let start = input.checkpoint();
1120 match parser.parse_next(input) {
1121 Err(e) if e.is_backtrack() => {
1122 input.reset(&start);
1123 return Ok(acc);
1124 }
1125 Err(e) => return Err(e),
1126 Ok(o) => {
1127 acc.accumulate(o);
1128 }
1129 }
1130
1131 loop {
1132 let start = input.checkpoint();
1133 let len = input.eof_offset();
1134 match separator.parse_next(input) {
1135 Err(e) if e.is_backtrack() => {
1136 input.reset(&start);
1137 return Ok(acc);
1138 }
1139 Err(e) => return Err(e),
1140 Ok(_) => {
1141 // infinite loop check
1142 if input.eof_offset() == len {
1143 return Err(ParserError::assert(
1144 input,
1145 "`separated` separator parser must always consume",
1146 ));
1147 }
1148
1149 match parser.parse_next(input) {
1150 Err(e) if e.is_backtrack() => {
1151 input.reset(&start);
1152 return Ok(acc);
1153 }
1154 Err(e) => return Err(e),
1155 Ok(o) => {
1156 acc.accumulate(o);
1157 }
1158 }
1159 }
1160 }
1161 }
1162}
1163
1164fn separated1_<I, O, C, O2, E, P, S>(
1165 parser: &mut P,
1166 separator: &mut S,
1167 input: &mut I,
1168) -> Result<C, E>
1169where
1170 I: Stream,
1171 C: Accumulate<O>,
1172 P: Parser<I, O, E>,
1173 S: Parser<I, O2, E>,
1174 E: ParserError<I>,
1175{
1176 let mut acc = C::initial(None);
1177
1178 // Parse the first element
1179 match parser.parse_next(input) {
1180 Err(e) => return Err(e),
1181 Ok(o) => {
1182 acc.accumulate(o);
1183 }
1184 }
1185
1186 loop {
1187 let start = input.checkpoint();
1188 let len = input.eof_offset();
1189 match separator.parse_next(input) {
1190 Err(e) if e.is_backtrack() => {
1191 input.reset(&start);
1192 return Ok(acc);
1193 }
1194 Err(e) => return Err(e),
1195 Ok(_) => {
1196 // infinite loop check
1197 if input.eof_offset() == len {
1198 return Err(ParserError::assert(
1199 input,
1200 "`separated` separator parser must always consume",
1201 ));
1202 }
1203
1204 match parser.parse_next(input) {
1205 Err(e) if e.is_backtrack() => {
1206 input.reset(&start);
1207 return Ok(acc);
1208 }
1209 Err(e) => return Err(e),
1210 Ok(o) => {
1211 acc.accumulate(o);
1212 }
1213 }
1214 }
1215 }
1216 }
1217}
1218
1219fn separated_n_<I, O, C, O2, E, P, S>(
1220 count: usize,
1221 parser: &mut P,
1222 separator: &mut S,
1223 input: &mut I,
1224) -> Result<C, E>
1225where
1226 I: Stream,
1227 C: Accumulate<O>,
1228 P: Parser<I, O, E>,
1229 S: Parser<I, O2, E>,
1230 E: ParserError<I>,
1231{
1232 let mut acc = C::initial(Some(count));
1233
1234 if count == 0 {
1235 return Ok(acc);
1236 }
1237
1238 let start = input.checkpoint();
1239 match parser.parse_next(input) {
1240 Err(e) => {
1241 return Err(e.append(input, &start));
1242 }
1243 Ok(o) => {
1244 acc.accumulate(o);
1245 }
1246 }
1247
1248 for _ in 1..count {
1249 let start = input.checkpoint();
1250 let len = input.eof_offset();
1251 match separator.parse_next(input) {
1252 Err(e) => {
1253 return Err(e.append(input, &start));
1254 }
1255 Ok(_) => {
1256 // infinite loop check
1257 if input.eof_offset() == len {
1258 return Err(ParserError::assert(
1259 input,
1260 "`separated` separator parser must always consume",
1261 ));
1262 }
1263
1264 match parser.parse_next(input) {
1265 Err(e) => {
1266 return Err(e.append(input, &start));
1267 }
1268 Ok(o) => {
1269 acc.accumulate(o);
1270 }
1271 }
1272 }
1273 }
1274 }
1275
1276 Ok(acc)
1277}
1278
1279fn separated_m_n_<I, O, C, O2, E, P, S>(
1280 min: usize,
1281 max: usize,
1282 parser: &mut P,
1283 separator: &mut S,
1284 input: &mut I,
1285) -> Result<C, E>
1286where
1287 I: Stream,
1288 C: Accumulate<O>,
1289 P: Parser<I, O, E>,
1290 S: Parser<I, O2, E>,
1291 E: ParserError<I>,
1292{
1293 if min > max {
1294 return Err(ParserError::assert(
1295 input,
1296 "range should be ascending, rather than descending",
1297 ));
1298 }
1299
1300 let mut acc = C::initial(Some(min));
1301
1302 let start = input.checkpoint();
1303 match parser.parse_next(input) {
1304 Err(e) if e.is_backtrack() => {
1305 if min == 0 {
1306 input.reset(&start);
1307 return Ok(acc);
1308 } else {
1309 return Err(e.append(input, &start));
1310 }
1311 }
1312 Err(e) => return Err(e),
1313 Ok(o) => {
1314 acc.accumulate(o);
1315 }
1316 }
1317
1318 for index in 1..max {
1319 let start = input.checkpoint();
1320 let len = input.eof_offset();
1321 match separator.parse_next(input) {
1322 Err(e) if e.is_backtrack() => {
1323 if index < min {
1324 return Err(e.append(input, &start));
1325 } else {
1326 input.reset(&start);
1327 return Ok(acc);
1328 }
1329 }
1330 Err(e) => {
1331 return Err(e);
1332 }
1333 Ok(_) => {
1334 // infinite loop check
1335 if input.eof_offset() == len {
1336 return Err(ParserError::assert(
1337 input,
1338 "`separated` separator parser must always consume",
1339 ));
1340 }
1341
1342 match parser.parse_next(input) {
1343 Err(e) if e.is_backtrack() => {
1344 if index < min {
1345 return Err(e.append(input, &start));
1346 } else {
1347 input.reset(&start);
1348 return Ok(acc);
1349 }
1350 }
1351 Err(e) => {
1352 return Err(e);
1353 }
1354 Ok(o) => {
1355 acc.accumulate(o);
1356 }
1357 }
1358 }
1359 }
1360 }
1361
1362 Ok(acc)
1363}
1364
1365/// Alternates between two parsers, merging the results (left associative)
1366///
1367/// This stops when either parser returns [`ErrMode::Backtrack`][crate::error::ErrMode::Backtrack]. To instead chain an error up, see
1368/// [`cut_err`][crate::combinator::cut_err].
1369///
1370/// # Example
1371///
1372/// ```rust
1373/// # use winnow::{error::ErrMode, error::Needed};
1374/// # use winnow::prelude::*;
1375/// use winnow::combinator::separated_foldl1;
1376/// use winnow::ascii::dec_int;
1377///
1378/// fn parser(s: &mut &str) -> ModalResult<i32> {
1379/// separated_foldl1(dec_int, "-", |l, _, r| l - r).parse_next(s)
1380/// }
1381///
1382/// assert_eq!(parser.parse_peek("9-3-5"), Ok(("", 1)));
1383/// assert!(parser.parse_peek("").is_err());
1384/// assert!(parser.parse_peek("def|abc").is_err());
1385/// ```
1386pub fn separated_foldl1<Input, Output, Sep, Error, ParseNext, SepParser, Op>(
1387 mut parser: ParseNext,
1388 mut sep: SepParser,
1389 mut op: Op,
1390) -> impl Parser<Input, Output, Error>
1391where
1392 Input: Stream,
1393 ParseNext: Parser<Input, Output, Error>,
1394 SepParser: Parser<Input, Sep, Error>,
1395 Error: ParserError<Input>,
1396 Op: FnMut(Output, Sep, Output) -> Output,
1397{
1398 trace("separated_foldl1", move |i: &mut Input| {
1399 let mut ol = parser.parse_next(i)?;
1400
1401 loop {
1402 let start = i.checkpoint();
1403 let len = i.eof_offset();
1404 match sep.parse_next(i) {
1405 Err(e) if e.is_backtrack() => {
1406 i.reset(&start);
1407 return Ok(ol);
1408 }
1409 Err(e) => return Err(e),
1410 Ok(s) => {
1411 // infinite loop check: the parser must always consume
1412 if i.eof_offset() == len {
1413 return Err(ParserError::assert(
1414 i,
1415 "`repeat` parsers must always consume",
1416 ));
1417 }
1418
1419 match parser.parse_next(i) {
1420 Err(e) if e.is_backtrack() => {
1421 i.reset(&start);
1422 return Ok(ol);
1423 }
1424 Err(e) => return Err(e),
1425 Ok(or) => {
1426 ol = op(ol, s, or);
1427 }
1428 }
1429 }
1430 }
1431 }
1432 })
1433}
1434
1435/// Alternates between two parsers, merging the results (right associative)
1436///
1437/// This stops when either parser returns [`ErrMode::Backtrack`][crate::error::ErrMode::Backtrack]. To instead chain an error up, see
1438/// [`cut_err`][crate::combinator::cut_err].
1439///
1440/// # Example
1441///
1442/// ```rust
1443/// # use winnow::{error::ErrMode, error::Needed};
1444/// # use winnow::prelude::*;
1445/// use winnow::combinator::separated_foldr1;
1446/// use winnow::ascii::dec_uint;
1447///
1448/// fn parser(s: &mut &str) -> ModalResult<u32> {
1449/// separated_foldr1(dec_uint, "^", |l: u32, _, r: u32| l.pow(r)).parse_next(s)
1450/// }
1451///
1452/// assert_eq!(parser.parse_peek("2^3^2"), Ok(("", 512)));
1453/// assert_eq!(parser.parse_peek("2"), Ok(("", 2)));
1454/// assert!(parser.parse_peek("").is_err());
1455/// assert!(parser.parse_peek("def|abc").is_err());
1456/// ```
1457#[cfg(feature = "alloc")]
1458pub fn separated_foldr1<Input, Output, Sep, Error, ParseNext, SepParser, Op>(
1459 mut parser: ParseNext,
1460 mut sep: SepParser,
1461 mut op: Op,
1462) -> impl Parser<Input, Output, Error>
1463where
1464 Input: Stream,
1465 ParseNext: Parser<Input, Output, Error>,
1466 SepParser: Parser<Input, Sep, Error>,
1467 Error: ParserError<Input>,
1468 Op: FnMut(Output, Sep, Output) -> Output,
1469{
1470 trace("separated_foldr1", move |i: &mut Input| {
1471 let ol = parser.parse_next(i)?;
1472 let all: crate::lib::std::vec::Vec<(Sep, Output)> =
1473 repeat(0.., (sep.by_ref(), parser.by_ref())).parse_next(i)?;
1474 if let Some((s, or)) = all
1475 .into_iter()
1476 .rev()
1477 .reduce(|(sr, or), (sl, ol)| (sl, op(ol, sr, or)))
1478 {
1479 let merged = op(ol, s, or);
1480 Ok(merged)
1481 } else {
1482 Ok(ol)
1483 }
1484 })
1485}
1486
1487/// Repeats the embedded parser, filling the given slice with results.
1488///
1489/// This parser fails if the input runs out before the given slice is full.
1490///
1491/// # Example
1492///
1493/// ```rust
1494/// # use winnow::{error::ErrMode, error::Needed};
1495/// # use winnow::prelude::*;
1496/// use winnow::combinator::fill;
1497///
1498/// fn parser<'i>(s: &mut &'i str) -> ModalResult<[&'i str; 2]> {
1499/// let mut buf = ["", ""];
1500/// fill("abc", &mut buf).parse_next(s)?;
1501/// Ok(buf)
1502/// }
1503///
1504/// assert_eq!(parser.parse_peek("abcabc"), Ok(("", ["abc", "abc"])));
1505/// assert!(parser.parse_peek("abc123").is_err());
1506/// assert!(parser.parse_peek("123123").is_err());
1507/// assert!(parser.parse_peek("").is_err());
1508/// assert_eq!(parser.parse_peek("abcabcabc"), Ok(("abc", ["abc", "abc"])));
1509/// ```
1510pub fn fill<'i, Input, Output, Error, ParseNext>(
1511 mut parser: ParseNext,
1512 buf: &'i mut [Output],
1513) -> impl Parser<Input, (), Error> + 'i
1514where
1515 Input: Stream + 'i,
1516 ParseNext: Parser<Input, Output, Error> + 'i,
1517 Error: ParserError<Input> + 'i,
1518{
1519 trace("fill", move |i: &mut Input| {
1520 for elem in buf.iter_mut() {
1521 let start = i.checkpoint();
1522 match parser.parse_next(i) {
1523 Ok(o) => {
1524 *elem = o;
1525 }
1526 Err(e) => {
1527 return Err(e.append(i, &start));
1528 }
1529 }
1530 }
1531
1532 Ok(())
1533 })
1534}