oni_comb_parser_rs/
lib.rs

1#![warn(dead_code)]
2#![allow(incomplete_features)]
3mod core;
4mod extension;
5mod internal;
6mod utils;
7
8pub mod prelude {
9  pub use crate::core::*;
10  pub use crate::extension::parser::*;
11  pub use crate::extension::parsers::*;
12  use crate::internal::*;
13  pub use crate::utils::*;
14  use std::fmt::{Debug, Display};
15
16  /// Returns a [Parser] that does nothing.<br/>
17  /// 何もしない[Parser]を返します。
18  ///
19  /// # Example
20  ///
21  /// ```rust
22  /// # use oni_comb_parser_rs::prelude::*;
23  ///
24  /// let text: &str = "a";
25  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
26  ///
27  /// let parser: Parser<char, ()> = unit();
28  ///
29  /// let result: ParseResult<char, ()> = parser.parse(&input);
30  ///
31  /// assert!(result.is_success());
32  /// assert_eq!(result.success().unwrap(), ());
33  /// ```
34  pub fn unit<'a, I>() -> Parser<'a, I, ()> {
35    ParsersImpl::unit()
36  }
37
38  /// Returns a [Parser] that does nothing. It is an alias for `unit()`.<br/>
39  /// 何もしない[Parser]を返します。`unit()`のエイリアスです。
40  ///
41  /// # Example
42  ///
43  /// ```rust
44  /// use oni_comb_parser_rs::prelude::*;
45  ///
46  /// let text: &str = "a";
47  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
48  ///
49  /// let parser: Parser<char, ()> = empty();
50  ///
51  /// let result: ParseResult<char, ()> = parser.parse(&input);
52  ///
53  /// assert!(result.is_success());
54  /// assert_eq!(result.success().unwrap(), ());
55  /// ```
56  pub fn empty<'a, I>() -> Parser<'a, I, ()> {
57    ParsersImpl::empty()
58  }
59
60  /// Returns a [Parser] representing the termination.<br/>
61  /// 終端を表す[Parser]を返します。
62  ///
63  /// Returns `Ok(())` if the termination is parsed successfully, `Err(Mismatch)` if the parsing fails.
64  ///
65  /// 終端の解析に成功したら`Ok(())`を返し、解析に失敗したら`Err(Mismatch)`を返します。
66  ///
67  /// # Example(例)
68  ///
69  /// ## Success case
70  ///
71  /// ```rust
72  /// use oni_comb_parser_rs::prelude::*;
73  ///
74  /// let text: &str = "a";
75  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
76  ///
77  /// let parser: Parser<char, ()> = end();
78  ///
79  /// let result: Result<(), ParseError<char>> = parser.parse(&input).to_result();
80  ///
81  /// assert!(result.is_err());
82  /// ```
83  pub fn end<'a, I>() -> Parser<'a, I, ()>
84  where
85    I: Debug + Display + 'a, {
86    ParsersImpl::end()
87  }
88
89  /// Returns a [Parser] representing the successful parsing result.<br/>
90  /// 成功した解析結果を表す[Parser]を返します。
91  ///
92  /// # Example
93  ///
94  /// ```rust
95  /// use oni_comb_parser_rs::prelude::*;
96  ///
97  /// let text: &str = "x";
98  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
99  ///
100  /// let parser: Parser<char, char> = successful('a');
101  ///
102  /// let result: ParseResult<char, char> = parser.parse(&input);
103  ///
104  /// assert!(result.is_success());
105  /// assert_eq!(result.success().unwrap(), 'a');
106  /// ```
107  pub fn successful<'a, I, A>(value: A) -> Parser<'a, I, A>
108  where
109    I: 'a,
110    A: Clone + 'a, {
111    ParsersImpl::successful(value)
112  }
113
114  /// Returns a [Parser] representing the successful parsing result.<br/>
115  /// 成功した解析結果を表す[Parser]を返します。
116  ///
117  /// - f: a closure that returns the parsed result value.
118  /// - f: 解析結果の値を返すクロージャ
119  ///
120  /// # Example
121  ///
122  /// ```rust
123  /// use oni_comb_parser_rs::prelude::*;
124  ///
125  /// let text: &str = "x";
126  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
127  ///
128  /// let parser: Parser<char, char> = successful_lazy(|| 'a');
129  ///
130  /// let result: ParseResult<char, char> = parser.parse(&input);
131  ///
132  /// assert!(result.is_success());
133  /// assert_eq!(result.success().unwrap(), 'a');
134  /// ```
135  pub fn successful_lazy<'a, I, A, F>(f: F) -> Parser<'a, I, A>
136  where
137    I: 'a,
138    F: Fn() -> A + 'a,
139    A: 'a, {
140    ParsersImpl::successful_lazy(f)
141  }
142
143  /// Returns a [Parser] that represents the result of the failed parsing.<br/>
144  /// 失敗した解析結果を表す[Parser]を返します。
145  ///
146  /// - value: [ParseError]
147  ///
148  /// # Example
149  ///
150  /// ```rust
151  /// use oni_comb_parser_rs::prelude::*;
152  ///
153  /// let text: &str = "x";
154  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
155  ///
156  /// let parse_error: ParseError<char> = ParseError::of_in_complete();
157  ///
158  /// let parser: Parser<char, ()> = failed(parse_error.clone(), CommittedStatus::Committed);
159  ///
160  /// let result: ParseResult<char, ()> = parser.parse(&input);
161  ///
162  /// assert!(result.is_failure());
163  /// assert_eq!(result.failure().unwrap(), parse_error);
164  /// ```
165  pub fn failed<'a, I, A>(value: ParseError<'a, I>, commit: CommittedStatus) -> Parser<'a, I, A>
166  where
167    I: Clone + 'a,
168    A: 'a, {
169    ParsersImpl::failed(value, commit)
170  }
171
172  /// Returns a [Parser] that returns and commits the failed parsing result.<br/>
173  /// 失敗した解析結果を返しコミットする[Parser]を返します。
174  ///
175  /// - value: [ParseError]
176  ///
177  /// # Example
178  ///
179  /// ```rust
180  /// use oni_comb_parser_rs::prelude::*;
181  ///
182  /// let text: &str = "x";
183  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
184  ///
185  /// let parse_error: ParseError<char> = ParseError::of_in_complete();
186  ///
187  /// let parser: Parser<char, ()> = failed_with_commit(parse_error.clone());
188  ///
189  /// let result: ParseResult<char, ()> = parser.parse(&input);
190  ///
191  /// assert!(result.is_failure());
192  /// assert_eq!(result.committed_status().unwrap(), CommittedStatus::Committed);
193  ///
194  /// assert_eq!(result.failure().unwrap(), parse_error);
195  /// ```
196  pub fn failed_with_commit<'a, I, A>(value: ParseError<'a, I>) -> Parser<'a, I, A>
197  where
198    I: Clone + 'a,
199    A: 'a, {
200    ParsersImpl::failed(value, CommittedStatus::Committed)
201  }
202
203  /// Returns a [Parser] that returns failed parsing results and does not commit.<br/>
204  /// 失敗した解析結果を返しコミットしない[Parser]を返します。
205  ///
206  /// - value: [ParseError]
207  ///
208  /// # Example
209  ///
210  /// ```rust
211  /// use oni_comb_parser_rs::prelude::*;
212  ///
213  /// let text: &str = "x";
214  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
215  ///
216  /// let parse_error: ParseError<char> = ParseError::of_in_complete();
217  ///
218  /// let parser: Parser<char, ()> = failed_with_uncommit(parse_error.clone());
219  ///
220  /// let result: ParseResult<char, ()> = parser.parse(&input);
221  ///
222  /// assert!(result.is_failure());
223  /// assert_eq!(result.committed_status().unwrap(), CommittedStatus::Uncommitted);
224  ///
225  /// assert_eq!(result.failure().unwrap(), parse_error);
226  /// ```
227  pub fn failed_with_uncommit<'a, I, A>(value: ParseError<'a, I>) -> Parser<'a, I, A>
228  where
229    I: Clone + 'a,
230    A: 'a, {
231    ParsersImpl::failed(value, CommittedStatus::Uncommitted)
232  }
233
234  /// Returns a [Parser] that represents the result of the failed parsing.<br/>
235  /// 失敗した解析結果を表す[Parser]を返します。
236  ///
237  /// - f: 失敗した解析結果を返すクロージャ
238  /// - f: Closure that returns failed analysis results.
239  ///
240  /// # Example
241  ///
242  /// ```rust
243  /// use oni_comb_parser_rs::prelude::*;
244  ///
245  /// let text: &str = "x";
246  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
247  ///
248  /// let parse_error: ParseError<char> = ParseError::of_in_complete();
249  ///
250  /// let parser: Parser<char, ()> = failed_lazy(|| (parse_error.clone(), CommittedStatus::Committed));
251  ///
252  /// let result: ParseResult<char, ()> = parser.parse(&input);
253  ///
254  /// assert!(result.is_failure());
255  /// assert_eq!(result.failure().unwrap(), parse_error);
256  /// ```
257  pub fn failed_lazy<'a, I, A, F>(f: F) -> Parser<'a, I, A>
258  where
259    F: Fn() -> (ParseError<'a, I>, CommittedStatus) + 'a,
260    I: 'a,
261    A: 'a, {
262    ParsersImpl::failed_lazy(f)
263  }
264
265  // --- Element Parsers ---
266  /// Returns a [Parser] that parses an any element.(for reference)<br/>
267  /// 任意の要素を解析する[Parser]を返します。(参照版)
268  ///
269  /// # Example
270  ///
271  /// ```rust
272  /// use oni_comb_parser_rs::prelude::*;
273  ///
274  /// let text: &str = "x";
275  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
276  ///
277  /// let parser: Parser<char, &char> = elm_any_ref();
278  ///
279  /// let result: ParseResult<char, &char> = parser.parse(&input);
280  ///
281  /// assert!(result.is_success());
282  /// assert_eq!(result.success().unwrap(), &input[0]);
283  /// ```
284  pub fn elm_any_ref<'a, I>() -> Parser<'a, I, &'a I>
285  where
286    I: Element + PartialEq + 'a, {
287    ParsersImpl::elm_any_ref()
288  }
289
290  /// Returns a [Parser] that parses an any element.<br/>
291  /// 任意の要素を解析する[Parser]を返します。
292  ///
293  /// # Example
294  ///
295  /// ```rust
296  /// use oni_comb_parser_rs::prelude::*;
297  ///
298  /// let text: &str = "x";
299  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
300  ///
301  /// let parser: Parser<char, char> = elm_any();
302  ///
303  /// let result: ParseResult<char, char> = parser.parse(&input);
304  ///
305  /// assert!(result.is_success());
306  /// assert_eq!(result.success().unwrap(), input[0]);
307  /// ```
308  pub fn elm_any<'a, I>() -> Parser<'a, I, I>
309  where
310    I: Element + Clone + PartialEq + 'a, {
311    ParsersImpl::elm_any()
312  }
313
314  /// Returns a [Parser] that parses the specified element.(for reference)<br/>
315  /// 指定した要素を解析する[Parser]を返します。(参照版)
316  ///
317  /// - element: element
318  /// - element: 要素
319  ///
320  /// # Example(例)
321  ///
322  /// ```rust
323  /// use oni_comb_parser_rs::prelude::*;
324  ///
325  /// let text: &str = "x";
326  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
327  ///
328  /// let parser: Parser<char, &char> = elm_ref('x');
329  ///
330  /// let result: ParseResult<char, &char> = parser.parse(&input);
331  ///
332  /// assert!(result.is_success());
333  /// assert_eq!(result.success().unwrap(), &input[0]);
334  /// ```
335  pub fn elm_ref<'a, I>(element: I) -> Parser<'a, I, &'a I>
336  where
337    I: Element + PartialEq + 'a, {
338    ParsersImpl::elm_ref(element)
339  }
340
341  /// Returns a [Parser] that parses the specified element.<br/>
342  /// 指定した要素を解析する[Parser]を返します。
343  ///
344  /// - element: an element
345  /// - element: 要素
346  ///
347  /// # Example
348  ///
349  /// ```rust
350  /// use oni_comb_parser_rs::prelude::*;
351  ///
352  /// let text: &str = "x";
353  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
354  ///
355  /// let parser: Parser<char, char> = elm('x');
356  ///
357  /// let result: ParseResult<char, char> = parser.parse(&input);
358  ///
359  /// assert!(result.is_success());
360  /// assert_eq!(result.success().unwrap(), input[0]);
361  /// ```
362  pub fn elm<'a, I>(element: I) -> Parser<'a, I, I>
363  where
364    I: Element + Clone + PartialEq + 'a, {
365    ParsersImpl::elm(element)
366  }
367
368  /// Returns a [Parser] that parses the elements that satisfy the specified closure conditions.(for reference)<br/>
369  /// 指定されたクロージャの条件を満たす要素を解析する[Parser]を返します。(参照版)
370  ///
371  /// - f: Closure(クロージャ)
372  ///
373  /// # Example
374  ///
375  /// ```rust
376  /// use oni_comb_parser_rs::prelude::*;
377  ///
378  /// let text: &str = "x";
379  /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
380  ///
381  /// let parser: Parser<char, &char> = elm_pred_ref(|c| *c == 'x');
382  ///
383  /// let result: ParseResult<char, &char> = parser.parse(&input);
384  ///
385  /// assert!(result.is_success());
386  /// assert_eq!(result.success().unwrap(), &input[0]);
387  /// ```
388  pub fn elm_pred_ref<'a, I, F>(f: F) -> Parser<'a, I, &'a I>
389  where
390    F: Fn(&I) -> bool + 'a,
391    I: Element + PartialEq + 'a, {
392    ParsersImpl::elm_pred_ref(f)
393  }
394
395  /// Returns a [Parser] that parses the elements that satisfy the specified closure conditions.<br/>
396  /// 指定されたクロージャの条件を満たす要素を解析するパーサーを返します。
397  ///
398  /// - f: closure
399  /// - f: クロージャ
400  ///
401  /// # Example
402  ///
403  /// ## Success case
404  ///
405  /// ```rust
406  /// use oni_comb_parser_rs::prelude::*;
407  ///
408  /// let text: &str = "x";
409  /// let input = text.chars().collect::<Vec<_>>();
410  ///
411  /// let parser: Parser<char, char> = elm_pred(|c| *c == 'x');
412  ///
413  /// let result: ParseResult<char, char> = parser.parse(&input);
414  ///
415  /// assert!(result.is_success());
416  /// assert_eq!(result.success().unwrap(), input[0]);
417  /// ```
418  pub fn elm_pred<'a, I, F>(f: F) -> Parser<'a, I, I>
419  where
420    F: Fn(&I) -> bool + 'a,
421    I: Element + Clone + PartialEq + 'a, {
422    ParsersImpl::elm_pred(f)
423  }
424
425  /// Returns a [Parser] that parses the elements in the specified set. (for reference)<br/>
426  /// 指定した集合の要素を解析する[Parser]を返します。(参照版)
427  ///
428  /// - set: element of sets
429  /// - set: 要素の集合
430  ///
431  /// # Example
432  ///
433  /// ```rust
434  /// use std::iter::FromIterator;
435  /// use oni_comb_parser_rs::prelude::*;
436  ///
437  /// let text: &str = "xyz";
438  /// let input = text.chars().collect::<Vec<_>>();
439  ///
440  /// let parser: Parser<char, String> = elm_ref_of("xyz").of_many1().collect().map(String::from_iter);
441  ///
442  /// let result: ParseResult<char, String> = parser.parse(&input);
443  ///
444  /// assert!(result.is_success());
445  /// assert_eq!(result.success().unwrap(), text);
446  /// ```
447  pub fn elm_ref_of<'a, I, S>(set: &'a S) -> Parser<'a, I, &'a I>
448  where
449    I: PartialEq + Display + Debug + 'a,
450    S: Set<I> + ?Sized, {
451    ParsersImpl::elm_ref_of(set)
452  }
453
454  /// Returns a [Parser] that parses the elements in the specified set.<br/>
455  /// 指定した集合の要素を解析する[Parser]を返します。
456  ///
457  /// - set: element of sets
458  /// - set: 要素の集合
459  ///
460  /// # Example
461  ///
462  /// ```rust
463  /// use std::iter::FromIterator;
464  /// use oni_comb_parser_rs::prelude::*;
465  ///
466  /// let text: &str = "xyz";
467  /// let input = text.chars().collect::<Vec<_>>();
468  ///
469  /// let parser: Parser<char, String> = elm_of("xyz").of_many1().map(String::from_iter);
470  ///
471  /// let result: ParseResult<char, String> = parser.parse(&input);
472  ///
473  /// assert!(result.is_success());
474  /// assert_eq!(result.success().unwrap(), text);
475  /// ```
476  pub fn elm_of<'a, I, S>(set: &'a S) -> Parser<'a, I, I>
477  where
478    I: PartialEq + Display + Clone + Debug + 'a,
479    S: Set<I> + ?Sized, {
480    ParsersImpl::elm_of(set)
481  }
482
483  /// Returns a [Parser] that parses the elements in the specified range. (for reference)<br/>
484  /// 指定した範囲の要素を解析する[Parser]を返します。(参照版)
485  ///
486  /// - start: start element
487  /// - end: end element
488  ///
489  /// - start: 開始要素
490  /// - end: 終了要素
491  ///
492  /// # Example
493  ///
494  /// ```rust
495  /// use std::iter::FromIterator;
496  /// use oni_comb_parser_rs::prelude::*;
497  ///
498  /// let text: &str = "xyz";
499  /// let input = text.chars().collect::<Vec<_>>();
500  ///
501  /// let parser: Parser<char, String> = elm_in_ref('x', 'z').of_many1().map(String::from_iter);
502  ///
503  /// let result: ParseResult<char, String> = parser.parse(&input);
504  ///
505  /// assert!(result.is_success());
506  /// assert_eq!(result.success().unwrap(), text);
507  /// ```
508  pub fn elm_in_ref<'a, I>(start: I, end: I) -> Parser<'a, I, &'a I>
509  where
510    I: PartialEq + PartialOrd + Display + Copy + Debug + 'a, {
511    ParsersImpl::elm_ref_in(start, end)
512  }
513
514  /// Returns a [Parser] that parses the elements in the specified range.<br/>
515  /// 指定した範囲の要素を解析する[Parser]を返します。
516  ///
517  /// - start: start element
518  /// - end: end element
519  ///
520  /// - start: 開始要素
521  /// - end: 終了要素
522  ///
523  /// # Example
524  ///
525  /// ```rust
526  /// use std::iter::FromIterator;
527  /// use oni_comb_parser_rs::prelude::*;
528  ///
529  /// let text: &str = "xyz";
530  /// let input = text.chars().collect::<Vec<_>>();
531  ///
532  /// let parser: Parser<char, String> = elm_in('x', 'z').of_many1().map(String::from_iter);
533  ///
534  /// let result: ParseResult<char, String> = parser.parse(&input);
535  ///
536  /// assert!(result.is_success());
537  /// assert_eq!(result.success().unwrap(), text);
538  /// ```
539  pub fn elm_in<'a, I>(start: I, end: I) -> Parser<'a, I, I>
540  where
541    I: PartialEq + PartialOrd + Display + Copy + Clone + Debug + 'a, {
542    ParsersImpl::elm_in(start, end)
543  }
544
545  /// Returns a [Parser] that parses the elements in the specified range. (for reference)<br/>
546  /// 指定した範囲の要素を解析する[Parser]を返します。(参照版)
547  ///
548  /// - start: a start element
549  /// - end: an end element, process up to the element at end - 1
550  ///
551  /// - start: 開始要素
552  /// - end: 終了要素, end - 1の要素まで処理
553  ///
554  /// # Example
555  ///
556  /// ```rust
557  /// use std::iter::FromIterator;
558  /// use oni_comb_parser_rs::prelude::*;
559  ///
560  /// let text: &str = "wxy";
561  /// let input = text.chars().collect::<Vec<_>>();
562  ///
563  /// let parser: Parser<char, String> = elm_from_until_ref('w', 'z').of_many1().map(String::from_iter);
564  ///
565  /// let result: ParseResult<char, String> = parser.parse(&input);
566  ///
567  /// assert!(result.is_success());
568  /// assert_eq!(result.success().unwrap(), text);
569  /// ```
570  pub fn elm_from_until_ref<'a, I>(start: I, end: I) -> Parser<'a, I, &'a I>
571  where
572    I: PartialEq + PartialOrd + Display + Copy + Debug + 'a, {
573    ParsersImpl::elm_ref_from_until(start, end)
574  }
575
576  /// Returns a [Parser] that parses the elements in the specified range.<br/>
577  /// 指定した範囲の要素を解析する[Parser]を返します。
578  ///
579  /// - start: a start element
580  /// - end: an end element, process up to the element at end - 1
581  ///
582  /// - start: 開始要素
583  /// - end: 終了要素, end - 1の要素まで処理
584  ///
585  /// # Example
586  ///
587  /// ```rust
588  /// use std::iter::FromIterator;
589  /// use oni_comb_parser_rs::prelude::*;
590  ///
591  /// let text: &str = "wxy";
592  /// let input = text.chars().collect::<Vec<_>>();
593  ///
594  /// let parser: Parser<char, String> = elm_from_until('w', 'z').of_many1().map(String::from_iter);
595  ///
596  /// let result: ParseResult<char, String> = parser.parse(&input);
597  ///
598  /// assert!(result.is_success());
599  /// assert_eq!(result.success().unwrap(), text);
600  /// ```
601  pub fn elm_from_until<'a, I>(start: I, end: I) -> Parser<'a, I, I>
602  where
603    I: PartialEq + PartialOrd + Display + Copy + Clone + Debug + 'a, {
604    ParsersImpl::elm_from_until(start, end)
605  }
606
607  /// Returns a [Parser] that parses elements that do not contain elements of the specified set.(for reference)<br/>
608  /// 指定した集合の要素を含まない要素を解析する[Parser]を返します。(参照版)
609  ///
610  /// - set: a element of sets
611  /// - set: 要素の集合
612  ///
613  /// # Example
614  ///
615  /// ```rust
616  /// use std::iter::FromIterator;
617  /// use oni_comb_parser_rs::prelude::*;
618  ///
619  /// let text: &str = "xyz";
620  /// let input = text.chars().collect::<Vec<_>>();
621  ///
622  /// let parser: Parser<char, String> = none_ref_of("abc").of_many1().map(String::from_iter);
623  ///
624  /// let result: ParseResult<char, String> = parser.parse(&input);
625  ///
626  /// assert!(result.is_success());
627  /// assert_eq!(result.success().unwrap(), text);
628  /// ```
629  pub fn none_ref_of<'a, I, S>(set: &'a S) -> Parser<'a, I, &'a I>
630  where
631    I: PartialEq + Display + Debug + 'a,
632    S: Set<I> + ?Sized, {
633    ParsersImpl::none_ref_of(set)
634  }
635
636  /// Returns a [Parser] that parses elements that do not contain elements of the specified set.<br/>
637  /// 指定した集合の要素を含まない要素を解析する[Parser]を返します。
638  ///
639  /// - set: an element of sets
640  /// - set: 要素の集合
641  ///
642  /// # Example
643  ///
644  /// ```rust
645  /// use std::iter::FromIterator;
646  /// use oni_comb_parser_rs::prelude::*;
647  ///
648  /// let text: &str = "xyz";
649  /// let input = text.chars().collect::<Vec<_>>();
650  ///
651  /// let parser: Parser<char, String> = none_of("abc").of_many1().map(String::from_iter);
652  ///
653  /// let result: ParseResult<char, String> = parser.parse(&input);
654  ///
655  /// assert!(result.is_success());
656  /// assert_eq!(result.success().unwrap(), text);
657  /// ```
658  pub fn none_of<'a, I, S>(set: &'a S) -> Parser<'a, I, I>
659  where
660    I: PartialEq + Display + Clone + Debug + 'a,
661    S: Set<I> + ?Sized, {
662    ParsersImpl::none_of(set)
663  }
664
665  /// Returns a [Parser] that parses the space (' ', '\t'). (for reference)<br/>
666  /// スペース(' ', '\t')を解析する[Parser]を返します。(参照版)
667  ///
668  /// # Example
669  ///
670  /// ```rust
671  /// use std::iter::FromIterator;
672  /// use oni_comb_parser_rs::prelude::*;
673  ///
674  /// let text: &str = "   ";
675  /// let input = text.chars().collect::<Vec<_>>();
676  ///
677  /// let parser: Parser<char, String> = elm_space_ref().of_many1().map(String::from_iter);
678  ///
679  /// let result: ParseResult<char, String> = parser.parse(&input);
680  ///
681  /// assert!(result.is_success());
682  /// assert_eq!(result.success().unwrap(), text);
683  /// ```
684  pub fn elm_space_ref<'a, I>() -> Parser<'a, I, &'a I>
685  where
686    I: Element + PartialEq + 'a, {
687    ParsersImpl::elm_space_ref()
688  }
689
690  /// Returns a [Parser] that parses the space (' ', '\t').<br/>
691  /// スペース(' ', '\t')を解析する[Parser]を返します。
692  ///
693  /// # Example
694  ///
695  /// ```rust
696  /// use std::iter::FromIterator;
697  /// use oni_comb_parser_rs::prelude::*;
698  ///
699  /// let text: &str = "   ";
700  /// let input = text.chars().collect::<Vec<_>>();
701  ///
702  /// let parser: Parser<char, String> = elm_space().of_many1().map(String::from_iter);
703  ///
704  /// let result: ParseResult<char, String> = parser.parse(&input);
705  ///
706  /// assert!(result.is_success());
707  /// assert_eq!(result.success().unwrap(), text);
708  /// ```
709  pub fn elm_space<'a, I>() -> Parser<'a, I, I>
710  where
711    I: Element + Clone + PartialEq + 'a, {
712    ParsersImpl::elm_space()
713  }
714
715  /// Returns a [Parser] that parses spaces containing newlines (' ', '\t', '\n', '\r'). (for reference)<br/>
716  /// 改行を含むスペース(' ', '\t', '\n', '\r')を解析する[Parser]を返します。(参照版)
717  ///
718  /// # Example
719  ///
720  /// ```rust
721  /// use std::iter::FromIterator;
722  /// use oni_comb_parser_rs::prelude::*;
723  ///
724  /// let text: &str = " \n ";
725  /// let input = text.chars().collect::<Vec<_>>();
726  ///
727  /// let parser: Parser<char, String> = elm_multi_space_ref().of_many1().map(String::from_iter);
728  ///
729  /// let result: ParseResult<char, String> = parser.parse(&input);
730  ///
731  /// assert!(result.is_success());
732  /// assert_eq!(result.success().unwrap(), text);
733  /// ```
734  pub fn elm_multi_space_ref<'a, I>() -> Parser<'a, I, &'a I>
735  where
736    I: Element + PartialEq + 'a, {
737    ParsersImpl::elm_multi_space_ref()
738  }
739
740  /// Returns a [Parser] that parses spaces containing newlines (' ', '\t', '\n', '\r').<br/>
741  /// 改行を含むスペース(' ', '\t', '\n', '\r')を解析する[Parser]を返します。
742  ///
743  /// # Example
744  ///
745  /// ```rust
746  /// use std::iter::FromIterator;
747  /// use oni_comb_parser_rs::prelude::*;
748  ///
749  /// let text: &str = " \n ";
750  /// let input = text.chars().collect::<Vec<_>>();
751  ///
752  /// let parser: Parser<char, String> = elm_multi_space().of_many1().map(String::from_iter);
753  ///
754  /// let result: ParseResult<char, String> = parser.parse(&input);
755  ///
756  /// assert!(result.is_success());
757  /// assert_eq!(result.success().unwrap(), text);
758  /// ```
759  pub fn elm_multi_space<'a, I>() -> Parser<'a, I, I>
760  where
761    I: Element + Clone + PartialEq + 'a, {
762    ParsersImpl::elm_multi_space()
763  }
764
765  /// Returns a [Parser] that parses alphabets ('A'..='Z', 'a'..='z').(for reference)<br/>
766  /// 英字('A'..='Z', 'a'..='z')を解析する[Parser]を返します。(参照版)
767  ///
768  /// # Example
769  ///
770  /// ```rust
771  /// use std::iter::FromIterator;
772  /// use oni_comb_parser_rs::prelude::*;
773  ///
774  /// let text: &str = "abcxyz";
775  /// let input = text.chars().collect::<Vec<_>>();
776  ///
777  /// let parser: Parser<char, String> = elm_alpha_ref().of_many1().map(String::from_iter);
778  ///
779  /// let result: ParseResult<char, String> = parser.parse(&input);
780  ///
781  /// assert!(result.is_success());
782  /// assert_eq!(result.success().unwrap(), text);
783  /// ```
784  pub fn elm_alpha_ref<'a, I>() -> Parser<'a, I, &'a I>
785  where
786    I: Element + PartialEq + 'a, {
787    ParsersImpl::elm_alpha_ref()
788  }
789
790  /// Returns a [Parser] that parses alphabets ('A'..='Z', 'a'..='z').<br/>
791  /// 英字('A'..='Z', 'a'..='z')を解析する[Parser]を返します。
792  ///
793  /// # Example
794  ///
795  /// ```rust
796  /// use std::iter::FromIterator;
797  /// use oni_comb_parser_rs::prelude::*;
798  ///
799  /// let text: &str = "abcxyz";
800  /// let input = text.chars().collect::<Vec<_>>();
801  ///
802  /// let parser: Parser<char, String> = elm_alpha().of_many1().map(String::from_iter);
803  ///
804  /// let result: ParseResult<char, String> = parser.parse(&input);
805  ///
806  /// assert!(result.is_success());
807  /// assert_eq!(result.success().unwrap(), text);
808  /// ```
809  pub fn elm_alpha<'a, I>() -> Parser<'a, I, I>
810  where
811    I: Element + Clone + PartialEq + 'a, {
812    ParsersImpl::elm_alpha()
813  }
814
815  /// Returns a [Parser] that parses alphabets and digits ('0'..='9', 'A'..='Z', 'a'..='z').(for reference)<br/>
816  /// 英数字('0'..='9', 'A'..='Z', 'a'..='z')を解析する[Parser]を返します。(参照版)
817  ///
818  /// # Example
819  ///
820  /// ```rust
821  /// use std::iter::FromIterator;
822  /// use oni_comb_parser_rs::prelude::*;
823  ///
824  /// let text: &str = "abc0123xyz";
825  /// let input = text.chars().collect::<Vec<_>>();
826  ///
827  /// let parser: Parser<char, String> = elm_alpha_digit_ref().of_many1().map(String::from_iter);
828  ///
829  /// let result: ParseResult<char, String> = parser.parse(&input);
830  ///
831  /// assert!(result.is_success());
832  /// assert_eq!(result.success().unwrap(), text);
833  /// ```
834  pub fn elm_alpha_digit_ref<'a, I>() -> Parser<'a, I, &'a I>
835  where
836    I: Element + PartialEq + 'a, {
837    ParsersImpl::elm_alpha_digit_ref()
838  }
839
840  /// Returns a [Parser] that parses alphabets and digits ('0'..='9', 'A'..='Z', 'a'..='z').<br/>
841  /// 英数字('0'..='9', 'A'..='Z', 'a'..='z')を解析する[Parser]を返します。
842  ///
843  /// # Example
844  ///
845  /// ```rust
846  /// use std::iter::FromIterator;
847  /// use oni_comb_parser_rs::prelude::*;
848  ///
849  /// let text: &str = "abc0123xyz";
850  /// let input = text.chars().collect::<Vec<_>>();
851  ///
852  /// let parser: Parser<char, String> = elm_alpha_digit().of_many1().map(String::from_iter);
853  ///
854  /// let result: ParseResult<char, String> = parser.parse(&input);
855  ///
856  /// assert!(result.is_success());
857  /// assert_eq!(result.success().unwrap(), text);
858  /// ```
859  pub fn elm_alpha_digit<'a, I>() -> Parser<'a, I, I>
860  where
861    I: Element + Clone + PartialEq + 'a, {
862    ParsersImpl::elm_alpha_digit()
863  }
864
865  /// Returns a [Parser] that parses digits ('0'..='9').(for reference)<br/>
866  /// 数字('0'..='9')を解析する[Parser]を返します。(参照版)
867  ///
868  /// # Example
869  ///
870  /// ```rust
871  /// use std::iter::FromIterator;
872  /// use oni_comb_parser_rs::prelude::*;
873  ///
874  /// let text: &str = "0123456789";
875  /// let input = text.chars().collect::<Vec<_>>();
876  ///
877  /// let parser: Parser<char, String> = elm_digit_ref().of_many1().map(String::from_iter);
878  ///
879  /// let result: ParseResult<char, String> = parser.parse(&input);
880  ///
881  /// assert!(result.is_success());
882  /// assert_eq!(result.success().unwrap(), text);
883  /// ```
884  pub fn elm_digit_ref<'a, I>() -> Parser<'a, I, &'a I>
885  where
886    I: Element + PartialEq + 'a, {
887    ParsersImpl::elm_digit_ref()
888  }
889
890  /// Returns a [Parser] that parses digits ('0'..='9').<br/>
891  /// 数字('0'..='9')を解析する[Parser]を返します。
892  ///
893  /// # Example
894  ///
895  /// ```rust
896  /// use std::iter::FromIterator;
897  /// use oni_comb_parser_rs::prelude::*;
898  ///
899  /// let text: &str = "0123456789";
900  /// let input = text.chars().collect::<Vec<_>>();
901  ///
902  /// let parser: Parser<char, String> = elm_digit().of_many1().map(String::from_iter);
903  ///
904  /// let result: ParseResult<char, String> = parser.parse(&input);
905  ///
906  /// assert!(result.is_success());
907  /// assert_eq!(result.success().unwrap(), text);
908  /// ```
909  pub fn elm_digit<'a, I>() -> Parser<'a, I, I>
910  where
911    I: Element + Clone + PartialEq + 'a, {
912    ParsersImpl::elm_digit()
913  }
914
915  /// Returns a [Parser] that parses digits ('1'..='9').(for reference)<br/>
916  /// 数字('1'..='9')を解析する[Parser]を返します。(参照版)
917  ///
918  /// # Example
919  ///
920  /// ```rust
921  /// use std::iter::FromIterator;
922  /// use oni_comb_parser_rs::prelude::*;
923  ///
924  /// let text: &str = "123456789";
925  /// let input = text.chars().collect::<Vec<_>>();
926  ///
927  /// let parser: Parser<char, String> = elm_digit().of_many1().map(String::from_iter);
928  ///
929  /// let result: ParseResult<char, String> = parser.parse(&input);
930  ///
931  /// assert!(result.is_success());
932  /// assert_eq!(result.success().unwrap(), text);
933  /// ```
934  pub fn elm_digit_1_9_ref<'a, I>() -> Parser<'a, I, &'a I>
935  where
936    I: Element + PartialEq + 'a, {
937    elm_digit_ref().with_filter_not(|c: &&I| c.is_ascii_digit_zero())
938  }
939
940  /// Returns a [Parser] that parses digits ('1'..='9').<br/>
941  /// 数字('1'..='9')を解析する[Parser]を返します。
942  ///
943  /// # Example
944  ///
945  /// ```rust
946  /// use std::iter::FromIterator;
947  /// use oni_comb_parser_rs::prelude::*;
948  ///
949  /// let text: &str = "123456789";
950  /// let input = text.chars().collect::<Vec<_>>();
951  ///
952  /// let parser: Parser<char, String> = elm_digit_1_9().of_many1().map(String::from_iter);
953  ///
954  /// let result: ParseResult<char, String> = parser.parse(&input);
955  ///
956  /// assert!(result.is_success());
957  /// assert_eq!(result.success().unwrap(), text);
958  /// ```
959  pub fn elm_digit_1_9<'a, I>() -> Parser<'a, I, I>
960  where
961    I: Element + Clone + PartialEq + 'a, {
962    elm_digit_1_9_ref().map(Clone::clone)
963  }
964
965  /// Returns a [Parser] that parses hex digits ('0'..='9', 'A'..='F', 'a'..='f').(for reference)<br/>
966  /// 16進の数字('0'..='9', 'A'..='F', 'a'..='f')を解析する[Parser]を返します。(参照版)
967  ///
968  /// # Example
969  ///
970  /// ```rust
971  /// use std::iter::FromIterator;
972  /// use oni_comb_parser_rs::prelude::*;
973  ///
974  /// let text: &str = "0123456789ABCDEFabcdef";
975  /// let input = text.chars().collect::<Vec<_>>();
976  ///
977  /// let parser: Parser<char, String> = elm_hex_digit_ref().of_many1().map(String::from_iter);
978  ///
979  /// let result: ParseResult<char, String> = parser.parse(&input);
980  ///
981  /// assert!(result.is_success());
982  /// assert_eq!(result.success().unwrap(), text);
983  /// ```
984  pub fn elm_hex_digit_ref<'a, I>() -> Parser<'a, I, &'a I>
985  where
986    I: Element + PartialEq + 'a, {
987    ParsersImpl::elm_hex_digit_ref()
988  }
989
990  /// Returns a [Parser] that parses hex digits ('0'..='9', 'A'..='F', 'a'..='f').<br/>
991  /// 16進の数字('0'..='9', 'A'..='F', 'a'..='f')を解析する[Parser]を返します。
992  ///
993  /// # Example
994  ///
995  /// ```rust
996  /// use std::iter::FromIterator;
997  /// use oni_comb_parser_rs::prelude::*;
998  ///
999  /// let text: &str = "0123456789ABCDEFabcdef";
1000  /// let input = text.chars().collect::<Vec<_>>();
1001  ///
1002  /// let parser: Parser<char, String> = elm_hex_digit().of_many1().map(String::from_iter);
1003  ///
1004  /// let result: ParseResult<char, String> = parser.parse(&input);
1005  ///
1006  /// assert!(result.is_success());
1007  /// assert_eq!(result.success().unwrap(), text);
1008  /// ```
1009  pub fn elm_hex_digit<'a, I>() -> Parser<'a, I, I>
1010  where
1011    I: Element + Clone + PartialEq + 'a, {
1012    ParsersImpl::elm_hex_digit()
1013  }
1014
1015  /// Returns a [Parser] that parses oct digits ('0'..='8').(for reference)<br/>
1016  /// 8進の数字('0'..='8')を解析する[Parser]を返します。(参照版)
1017  ///
1018  /// # Example
1019  ///
1020  /// ```rust
1021  /// use std::iter::FromIterator;
1022  /// use oni_comb_parser_rs::prelude::*;
1023  ///
1024  /// let text: &str = "012345678";
1025  /// let input = text.chars().collect::<Vec<_>>();
1026  ///
1027  /// let parser: Parser<char, String> = elm_oct_digit_ref().of_many1().map(String::from_iter);
1028  ///
1029  /// let result: ParseResult<char, String> = parser.parse(&input);
1030  ///
1031  /// assert!(result.is_success());
1032  /// assert_eq!(result.success().unwrap(), text);
1033  /// ```
1034  pub fn elm_oct_digit_ref<'a, I>() -> Parser<'a, I, &'a I>
1035  where
1036    I: Element + PartialEq + 'a, {
1037    ParsersImpl::elm_oct_digit_ref()
1038  }
1039
1040  /// Returns a [Parser] that parses oct digits ('0'..='8').<br/>
1041  /// 8進の数字('0'..='8')を解析する[Parser]を返します。
1042  ///
1043  /// # Example
1044  ///
1045  /// ```rust
1046  /// use std::iter::FromIterator;
1047  /// use oni_comb_parser_rs::prelude::*;
1048  ///
1049  /// let text: &str = "012345678";
1050  /// let input = text.chars().collect::<Vec<_>>();
1051  ///
1052  /// let parser: Parser<char, String> = elm_oct_digit().of_many1().map(String::from_iter);
1053  ///
1054  /// let result: ParseResult<char, String> = parser.parse(&input);
1055  ///
1056  /// assert!(result.is_success());
1057  /// assert_eq!(result.success().unwrap(), text);
1058  /// ```
1059  pub fn elm_oct_digit<'a, I>() -> Parser<'a, I, I>
1060  where
1061    I: Element + PartialEq + Clone + 'a, {
1062    ParsersImpl::elm_oct_digit()
1063  }
1064
1065  // --- Elements Parsers ---
1066
1067  /// Returns a [Parser] that parses a sequence of elements.<br/>
1068  /// 要素の列を解析する[Parser]を返す。
1069  ///
1070  /// # Example
1071  ///
1072  /// ```rust
1073  /// use std::iter::FromIterator;
1074  /// use oni_comb_parser_rs::prelude::*;
1075  ///
1076  /// let text: &str = "abc";
1077  /// let input = text.as_bytes();
1078  ///
1079  /// let parser: Parser<u8, &str> = seq(b"abc").collect().map_res(std::str::from_utf8);
1080  ///
1081  /// let result: ParseResult<u8, &str> = parser.parse(input);
1082  ///
1083  /// assert!(result.is_success());
1084  /// assert_eq!(result.success().unwrap(), text);
1085  /// ```
1086  pub fn seq<'a, 'b, I>(seq: &'b [I]) -> Parser<'a, I, &'a [I]>
1087  where
1088    I: PartialEq + Debug + 'a,
1089    'b: 'a, {
1090    ParsersImpl::seq(seq)
1091  }
1092
1093  /// Returns a [Parser] that parses a string.<br/>
1094  /// 文字列を解析する[Parser]を返す。
1095  ///
1096  /// - tag: a string
1097  /// - tag: 文字列
1098  ///
1099  /// # Example
1100  ///
1101  /// ```rust
1102  /// use oni_comb_parser_rs::prelude::*;
1103  ///
1104  /// let text: &str = "abcdef";
1105  /// let input = text.chars().collect::<Vec<_>>();
1106  ///
1107  /// let parser: Parser<char, &str> = tag("abc");
1108  ///
1109  /// let result: ParseResult<char, &str> = parser.parse(&input);
1110  ///
1111  /// assert!(result.is_success());
1112  /// assert_eq!(result.success().unwrap(), "abc");
1113  /// ```
1114  pub fn tag<'a, 'b>(tag: &'b str) -> Parser<'a, char, &'a str>
1115  where
1116    'b: 'a, {
1117    ParsersImpl::tag(tag)
1118  }
1119
1120  /// Returns a [Parser] that parses a string. However, it is not case-sensitive.<br/>
1121  /// 文字列を解析する[Parser]を返す。ただし大文字小文字を区別しない。
1122  ///
1123  /// - tag: a string
1124  /// - tag: 文字列
1125  ///
1126  /// # Example
1127  ///
1128  /// ```rust
1129  /// use oni_comb_parser_rs::prelude::*;
1130  ///
1131  /// let text: &str = "abcdef";
1132  /// let input = text.chars().collect::<Vec<_>>();
1133  ///
1134  /// let parser: Parser<char, &str> = tag("abc");
1135  ///
1136  /// let result: ParseResult<char, &str> = parser.parse(&input);
1137  ///
1138  /// assert!(result.is_success());
1139  /// assert_eq!(result.success().unwrap(), "abc");
1140  /// ```
1141  pub fn tag_no_case<'a, 'b>(tag: &'b str) -> Parser<'a, char, &'a str>
1142  where
1143    'b: 'a, {
1144    ParsersImpl::tag_no_case(tag)
1145  }
1146
1147  /// Returns a [Parser] that parses a string that match a regular expression.<br/>
1148  /// 正規表現に合致する文字列を解析する[Parser]を返す。
1149  ///
1150  /// - pattern: a regular expression
1151  /// - pattern: 正規表現
1152  ///
1153  /// # Example
1154  ///
1155  /// ```rust
1156  /// use oni_comb_parser_rs::prelude::*;
1157  ///
1158  /// let text: &str = "abcdef";
1159  /// let input = text.chars().collect::<Vec<_>>();
1160  ///
1161  /// let parser: Parser<char, String> = regex("[abc]+");
1162  ///
1163  /// let result: ParseResult<char, String> = parser.parse(&input);
1164  ///
1165  /// assert!(result.is_success());
1166  /// assert_eq!(result.success().unwrap(), "abc");
1167  /// ```
1168  pub fn regex<'a>(pattern: &str) -> Parser<'a, char, String> {
1169    ParsersImpl::regex(pattern)
1170  }
1171
1172  /// Returns a [Parser] that returns an element of the specified length.<br/>
1173  /// 指定された長さの要素を返す[Parser]を返す。
1174  ///
1175  /// - n: Length of the reading element
1176  /// - n: 読む要素の長さ
1177  ///
1178  /// # Example
1179  ///
1180  /// ```rust
1181  /// use std::iter::FromIterator;
1182  /// use oni_comb_parser_rs::prelude::*;
1183  ///
1184  /// let text: &str = "abcdef";
1185  /// let input = text.chars().collect::<Vec<_>>();
1186  ///
1187  /// let parser: Parser<char, String> = take(3).map(String::from_iter);
1188  ///
1189  /// let result: ParseResult<char, String> = parser.parse(&input);
1190  ///
1191  /// assert!(result.is_success());
1192  /// assert_eq!(result.success().unwrap(), "abc");
1193  /// ```
1194  pub fn take<'a, I>(n: usize) -> Parser<'a, I, &'a [I]> {
1195    ParsersImpl::take(n)
1196  }
1197
1198  /// クロージャの結果が真である間は要素を返す[Parser]を返す。<br/>
1199  /// Returns a [Parser] that returns elements, while the result of the closure is true.
1200  ///
1201  /// 解析結果の長さは必須ではありません。<br/>
1202  /// The length of the analysis result is not required.
1203  ///
1204  /// # Example
1205  ///
1206  /// ```rust
1207  /// use std::iter::FromIterator;
1208  /// use oni_comb_parser_rs::prelude::*;
1209  ///
1210  /// let text: &str = "abcdef";
1211  /// let input = text.chars().collect::<Vec<_>>();
1212  ///
1213  /// let parser: Parser<char, String> = take_while0(|e| match *e {
1214  ///  'a'..='c' => true,
1215  ///   _ => false
1216  /// }).map(String::from_iter);
1217  ///
1218  /// let result: ParseResult<char, String> = parser.parse(&input);
1219  ///
1220  /// assert!(result.is_success());
1221  /// assert_eq!(result.success().unwrap(), "abc");
1222  /// ```
1223  ///
1224  /// ```rust
1225  /// use std::iter::FromIterator;
1226  /// use oni_comb_parser_rs::prelude::*;
1227  ///
1228  /// let text: &str = "def";
1229  /// let input = text.chars().collect::<Vec<_>>();
1230  ///
1231  /// let parser: Parser<char, String> = take_while0(|e| match *e {
1232  ///  'a'..='c' => true,
1233  ///   _ => false
1234  /// }).map(String::from_iter);
1235  ///
1236  /// let result: ParseResult<char, String> = parser.parse(&input);
1237  ///
1238  /// assert!(result.is_success());
1239  /// assert_eq!(result.success().unwrap(), "");
1240  /// ```
1241  pub fn take_while0<'a, I, F>(f: F) -> Parser<'a, I, &'a [I]>
1242  where
1243    F: Fn(&I) -> bool + 'a,
1244    I: Element + Debug + 'a, {
1245    ParsersImpl::take_while0(f)
1246  }
1247
1248  /// クロージャの結果が真である間は要素を返す[Parser]を返す。<br/>
1249  /// Returns a [Parser] that returns elements, while the result of the closure is true.
1250  ///
1251  /// 解析結果の長さは1要素以上必要です。<br/>
1252  /// The length of the analysis result must be at least one element.
1253  ///
1254  /// # Example
1255  ///
1256  /// ```rust
1257  /// use std::iter::FromIterator;
1258  /// use oni_comb_parser_rs::prelude::*;
1259  ///
1260  /// let text: &str = "abcdef";
1261  /// let input = text.chars().collect::<Vec<_>>();
1262  ///
1263  /// let parser: Parser<char, String> = take_while1(|e| match *e {
1264  ///  'a'..='c' => true,
1265  ///   _ => false
1266  /// }).map(String::from_iter);
1267  ///
1268  /// let result: ParseResult<char, String> = parser.parse(&input);
1269  ///
1270  /// assert!(result.is_success());
1271  /// assert_eq!(result.success().unwrap(), "abc");
1272  /// ```
1273  ///
1274  /// ```rust
1275  /// use std::iter::FromIterator;
1276  /// use oni_comb_parser_rs::prelude::*;
1277  ///
1278  /// let text: &str = "def";
1279  /// let input = text.chars().collect::<Vec<_>>();
1280  ///
1281  /// let parser: Parser<char, String> = take_while1(|e| match *e {
1282  ///  'a'..='c' => true,
1283  ///   _ => false
1284  /// }).map(String::from_iter);
1285  ///
1286  /// let result: ParseResult<char, String> = parser.parse(&input);
1287  ///
1288  /// assert!(result.is_failure());
1289  /// assert_eq!(result.failure().unwrap(), ParseError::of_in_complete());
1290  /// ```
1291  pub fn take_while1<'a, I, F>(f: F) -> Parser<'a, I, &'a [I]>
1292  where
1293    F: Fn(&I) -> bool + 'a,
1294    I: Element + Debug + 'a, {
1295    ParsersImpl::take_while1(f)
1296  }
1297
1298  /// クロージャの結果が真である間は要素を返す[Parser]を返す。<br/>
1299  /// Returns a [Parser] that returns elements, while the result of the closure is true.
1300  ///
1301  /// 解析結果の長さはn要素以上m要素以下である必要があります。<br/>
1302  /// The length of the analysis result should be between n and m elements.
1303  ///
1304  /// # Example
1305  ///
1306  /// ```rust
1307  /// use std::iter::FromIterator;
1308  /// use oni_comb_parser_rs::prelude::*;
1309  ///
1310  /// let text: &str = "abcdef";
1311  /// let input = text.chars().collect::<Vec<_>>();
1312  ///
1313  /// let parser: Parser<char, String> = take_while_n_m(1, 3, |e| match *e {
1314  ///  'a'..='c' => true,
1315  ///   _ => false
1316  /// }).map(String::from_iter);
1317  ///
1318  /// let result: ParseResult<char, String> = parser.parse(&input);
1319  ///
1320  /// assert!(result.is_success());
1321  /// assert_eq!(result.success().unwrap(), "abc");
1322  /// ```
1323  ///
1324  /// ```rust
1325  /// use std::iter::FromIterator;
1326  /// use oni_comb_parser_rs::prelude::*;
1327  ///
1328  /// let text: &str = "def";
1329  /// let input = text.chars().collect::<Vec<_>>();
1330  ///
1331  /// let parser: Parser<char, String> = take_while_n_m(1, 3, |e| match *e {
1332  ///  'a'..='c' => true,
1333  ///   _ => false
1334  /// }).map(String::from_iter);
1335  ///
1336  /// let result: ParseResult<char, String> = parser.parse(&input);
1337  ///
1338  /// assert!(result.is_failure());
1339  /// assert_eq!(result.failure().unwrap(), ParseError::of_in_complete());
1340  /// ```
1341  pub fn take_while_n_m<'a, I, F>(n: usize, m: usize, f: F) -> Parser<'a, I, &'a [I]>
1342  where
1343    F: Fn(&I) -> bool + 'a,
1344    I: Element + Debug + 'a, {
1345    ParsersImpl::take_while_n_m(n, m, f)
1346  }
1347
1348  /// Returns a [Parser] that returns a sequence up to either the end element or the element that matches the condition.<br/>
1349  /// 条件に一致する要素もしくは最後の要素までの連続を返す[Parser]を返す。
1350  ///
1351  /// 解析結果の長さは1要素以上必要です。<br/>
1352  /// The length of the analysis result must be at least one element.
1353  ///
1354  /// # Example
1355  ///
1356  /// ```rust
1357  /// use std::iter::FromIterator;
1358  /// use oni_comb_parser_rs::prelude::*;
1359  ///
1360  /// let text: &str = "abcdef";
1361  /// let input = text.chars().collect::<Vec<_>>();
1362  ///
1363  /// let parser: Parser<char, String> = take_till0(|e| matches!(*e, 'c')).map(String::from_iter);
1364  ///
1365  /// let result: ParseResult<char, String> = parser.parse(&input);
1366  ///
1367  /// assert!(result.is_success());
1368  /// assert_eq!(result.success().unwrap(), "abc");
1369  /// ```
1370  ///
1371  /// ```rust
1372  /// use std::iter::FromIterator;
1373  /// use oni_comb_parser_rs::prelude::*;
1374  ///
1375  /// let text: &str = "def";
1376  /// let input = text.chars().collect::<Vec<_>>();
1377  ///
1378  /// let parser: Parser<char, String> = take_till0(|e| matches!(*e, 'c')).map(String::from_iter);
1379  ///
1380  /// let result: ParseResult<char, String> = parser.parse(&input);
1381  ///
1382  /// assert!(result.is_success());
1383  /// assert_eq!(result.success().unwrap(), "def");
1384  /// ```
1385  pub fn take_till0<'a, I, F>(f: F) -> Parser<'a, I, &'a [I]>
1386  where
1387    F: Fn(&I) -> bool + 'a,
1388    I: Element + Debug + 'a, {
1389    ParsersImpl::take_till0(f)
1390  }
1391
1392  /// Returns a [Parser] that returns a sequence up to either the end element or the element that matches the condition.<br/>
1393  /// 条件に一致する要素もしくは最後の要素までの連続を返す[Parser]を返す。
1394  ///
1395  /// 解析結果の長さは1要素以上必要です。<br/>
1396  /// The length of the analysis result must be at least one element.
1397  ///
1398  /// # Example
1399  ///
1400  /// ```rust
1401  /// use std::iter::FromIterator;
1402  /// use oni_comb_parser_rs::prelude::*;
1403  ///
1404  /// let text: &str = "abcdef";
1405  /// let input = text.chars().collect::<Vec<_>>();
1406  ///
1407  /// let parser: Parser<char, String> = take_till1(|e| matches!(*e, 'c')).map(String::from_iter);
1408  ///
1409  /// let result: ParseResult<char, String> = parser.parse(&input);
1410  ///
1411  /// assert!(result.is_success());
1412  /// assert_eq!(result.success().unwrap(), "abc");
1413  /// ```
1414  ///
1415  /// ```rust
1416  /// use std::iter::FromIterator;
1417  /// use oni_comb_parser_rs::prelude::*;
1418  ///
1419  /// let text: &str = "def";
1420  /// let input = text.chars().collect::<Vec<_>>();
1421  ///
1422  /// let parser: Parser<char, String> = take_till1(|e| matches!(*e, 'c')).map(String::from_iter);
1423  ///
1424  /// let result: ParseResult<char, String> = parser.parse(&input);
1425  ///
1426  /// assert!(result.is_failure());
1427  /// assert_eq!(result.failure().unwrap(), ParseError::of_in_complete());
1428  /// ```
1429  pub fn take_till1<'a, I, F>(f: F) -> Parser<'a, I, &'a [I]>
1430  where
1431    F: Fn(&I) -> bool + 'a,
1432    I: Element + Debug + 'a, {
1433    ParsersImpl::take_till1(f)
1434  }
1435
1436  // --- Offset Control Parsers ---
1437
1438  /// Returns a [Parser] that skips the specified number of elements.<br/>
1439  /// 指定された数の要素をスキップする[Parser]を返す。
1440  ///
1441  /// - size: a size of elements
1442  /// - size: スキップする要素数
1443  ///
1444  /// # Example
1445  ///
1446  /// ```rust
1447  /// use std::iter::FromIterator;
1448  /// use oni_comb_parser_rs::prelude::*;
1449  ///
1450  /// let text: &str = "abcdef";
1451  /// let input = text.chars().collect::<Vec<_>>();
1452  ///
1453  /// let parser: Parser<char, &str> = (skip(3) * tag("def"));
1454  ///
1455  /// let result: ParseResult<char, &str> = parser.parse(&input);
1456  ///
1457  /// assert!(result.is_success());
1458  /// assert_eq!(result.success().unwrap(), "def");
1459  /// ```
1460  pub fn skip<'a, I>(n: usize) -> Parser<'a, I, ()> {
1461    ParsersImpl::skip(n)
1462  }
1463
1464  // --- Enhanced Parsers ---
1465
1466  /// Return a [Parser] that skips the previous and following [Parser]s.<br/>
1467  /// 前後のパーサーをスキップするパーサーを返す。
1468  ///
1469  /// - lp: 左側のパーサー
1470  /// - parser: 中央のパーサー
1471  /// - rp: 右側のパーサー
1472  ///
1473  /// # Example
1474  ///
1475  /// ```rust
1476  /// use std::iter::FromIterator;
1477  /// use oni_comb_parser_rs::prelude::*;
1478  ///
1479  /// let text: &str = "(abc)";
1480  /// let input = text.chars().collect::<Vec<_>>();
1481  ///
1482  /// let parser: Parser<char, &str> = surround(elm('('), tag("abc"), elm(')'));
1483  ///
1484  /// let result: ParseResult<char, &str> = parser.parse(&input);
1485  ///
1486  /// assert!(result.is_success());
1487  /// assert_eq!(result.success().unwrap(), "abc");
1488  /// ```
1489  pub fn surround<'a, I, A, B, C>(
1490    lp: Parser<'a, I, A>,
1491    parser: Parser<'a, I, B>,
1492    rp: Parser<'a, I, C>,
1493  ) -> Parser<'a, I, B>
1494  where
1495    A: Clone + Debug + 'a,
1496    B: Clone + Debug + 'a,
1497    C: Clone + Debug + 'a, {
1498    ParsersImpl::surround(lp, parser, rp)
1499  }
1500
1501  /// Returns a [Parser] that lazily evaluates the specified [Parser].<br/>
1502  /// 指定した[Parser]を遅延評価する[Parser]を返す。
1503  ///
1504  /// - f: Function to generate parser
1505  /// - f: パーサーを生成する関数
1506  ///
1507  /// # Example
1508  ///
1509  /// ```rust
1510  /// use std::iter::FromIterator;
1511  /// use oni_comb_parser_rs::prelude::*;
1512  ///
1513  /// let text: &str = "abc";
1514  /// let input = text.chars().collect::<Vec<_>>();
1515  ///
1516  /// fn value<'a>() -> Parser<'a, char, &'a str> {
1517  ///   tag("abc")
1518  /// }
1519  /// let parser: Parser<char, &str> = lazy(value);
1520  ///
1521  /// let result: ParseResult<char, &str> = parser.parse(&input);
1522  ///
1523  /// assert!(result.is_success());
1524  /// assert_eq!(result.success().unwrap(), "abc");
1525  /// ```
1526  pub fn lazy<'a, I, A, F>(f: F) -> Parser<'a, I, A>
1527  where
1528    F: Fn() -> Parser<'a, I, A> + 'a,
1529    A: Debug + 'a, {
1530    ParsersImpl::lazy(f)
1531  }
1532}
1533
1534#[cfg(test)]
1535mod tests {
1536  use std::env;
1537  use std::iter::FromIterator;
1538
1539  use crate::core::{ParserFunctor, ParserMonad, ParserRunner};
1540
1541  use crate::extension::parser::{
1542    CollectParser, ConversionParser, DiscardParser, LoggingParser, OffsetParser, OperatorParser, RepeatParser,
1543  };
1544
1545  use super::prelude::*;
1546
1547  fn init() {
1548    env::set_var("RUST_LOG", "debug");
1549    let _ = env_logger::builder().is_test(true).try_init();
1550  }
1551
1552  #[test]
1553  fn test_attempt() {
1554    init();
1555    {
1556      let input1 = b"b";
1557      let p: Parser<u8, &u8> = failed_with_commit(ParseError::of_in_complete())
1558        .attempt()
1559        .or(elm_ref(b'b'));
1560
1561      let r = p.parse_as_result(input1);
1562      assert!(r.is_ok());
1563    }
1564
1565    {
1566      let input1 = "abra cadabra!".chars().collect::<Vec<char>>();
1567      let p = (tag("abra") + elm_space() + tag("abra")).attempt() | (tag("abra") + elm_space() + tag("cadabra!"));
1568      let r = p.parse_as_result(&input1);
1569      println!("result = {:?}", r);
1570      assert!(r.is_ok());
1571    }
1572  }
1573
1574  #[test]
1575  fn test_successful_in_closure() {
1576    init();
1577    let input = b"a";
1578    let p = successful_lazy(|| 'a');
1579
1580    let r = p.parse_as_result(input).unwrap();
1581    assert_eq!(r, 'a');
1582  }
1583
1584  #[test]
1585  fn test_elem() {
1586    init();
1587    let p = elm(b'a');
1588
1589    let r = p.parse_as_result(b"a").unwrap();
1590    assert_eq!(r, b'a');
1591  }
1592
1593  #[test]
1594  fn test_regex() {
1595    init();
1596    let input1 = "abc".chars().collect::<Vec<char>>();
1597    let input2 = "xbc".chars().collect::<Vec<char>>();
1598    let p = regex(r"a.*c$").name("regex_1");
1599
1600    let r = p.parse_as_result(&input1);
1601    assert!(r.is_ok());
1602    assert_eq!(r.unwrap(), "abc");
1603
1604    let r = p.parse_as_result(&input2);
1605    assert!(r.is_err());
1606    println!("{}", r.err().unwrap());
1607
1608    {
1609      let input3 = "12345 to".chars().collect::<Vec<_>>();
1610      let p = regex(r"\d+");
1611      let r = p.parse_as_result(&input3);
1612      println!("{:?}", r);
1613      assert!(r.is_ok());
1614      // assert_eq!(r.unwrap(), "abc");
1615    }
1616  }
1617
1618  #[test]
1619  fn test_elm_of() {
1620    init();
1621    let patterns = b'a'..=b'f';
1622    let e = patterns.clone();
1623    let b = e.enumerate().into_iter().map(|e| e.1).collect::<Vec<_>>();
1624    let p = elm_of(&patterns);
1625
1626    for index in 0..b.len() {
1627      let r = p.parse_as_result(&b[index..]);
1628      assert!(r.is_ok());
1629      assert_eq!(r.unwrap(), b[index]);
1630    }
1631
1632    let r = p.parse_as_result(b"g");
1633    assert!(r.is_err());
1634  }
1635
1636  #[test]
1637  fn test_none_of() {
1638    init();
1639    let patterns = b'a'..=b'f';
1640    let e = patterns.clone();
1641    let b = e.enumerate().into_iter().map(|e| e.1).collect::<Vec<_>>();
1642    let p = none_of(&patterns);
1643
1644    for index in 0..b.len() {
1645      let r = p.parse_as_result(&b[index..]);
1646      assert!(r.is_err());
1647    }
1648
1649    let r = p.parse_as_result(b"g");
1650    assert!(r.is_ok());
1651    assert_eq!(r.unwrap(), b'g');
1652  }
1653
1654  #[test]
1655  fn test_peek() {
1656    init();
1657
1658    let input = "aname".chars().collect::<Vec<char>>();
1659    let p = elm('a').peek() + tag("aname");
1660
1661    let result = p.parse_as_result(&input).unwrap();
1662
1663    log::debug!("result = {:?}", result);
1664    assert_eq!(result.0, 'a');
1665    assert_eq!(result.1, "aname");
1666  }
1667
1668  #[test]
1669  fn test_repeat() {
1670    init();
1671    let p = elm_ref(b'a').repeat(..=3).collect();
1672
1673    let r = p.parse_as_result(b"");
1674    assert!(r.is_ok());
1675
1676    let r = p.parse_as_result(b"a").unwrap();
1677    assert_eq!(r, vec![b'a']);
1678
1679    let r = p.parse_as_result(b"aa").unwrap();
1680    assert_eq!(r, vec![b'a', b'a']);
1681
1682    let r = p.parse_as_result(b"aaa").unwrap();
1683    assert_eq!(r, vec![b'a', b'a', b'a']);
1684  }
1685
1686  #[test]
1687  fn test_many_0() {
1688    init();
1689    let p = elm_ref(b'a').of_many0().collect();
1690
1691    // let r = p.parse(b"").unwrap();
1692    // assert_eq!(r, vec![]);
1693
1694    let r = p.parse_as_result(b"a").unwrap();
1695    assert_eq!(r, vec![b'a']);
1696
1697    let r = p.parse_as_result(b"aa").unwrap();
1698    assert_eq!(r, vec![b'a', b'a']);
1699  }
1700
1701  #[test]
1702  fn test_many_1() {
1703    init();
1704    let p = elm_ref(b'a').of_many1().collect();
1705
1706    let r = p.parse_as_result(b"");
1707    assert!(r.is_err());
1708
1709    let r = p.parse_as_result(b"a").unwrap();
1710    assert_eq!(r, vec![b'a']);
1711
1712    let r = p.parse_as_result(b"aa").unwrap();
1713    assert_eq!(r, vec![b'a', b'a']);
1714  }
1715
1716  #[test]
1717  fn test_many_n_m() {
1718    init();
1719    let p = elm_ref(b'a').of_many_n_m(1, 2).collect() + end();
1720
1721    let r = p.parse_as_result(b"");
1722    assert!(r.is_err());
1723
1724    let (a, _) = p.parse_as_result(b"a").unwrap();
1725    assert_eq!(a, vec![b'a']);
1726
1727    let (a, _) = p.parse_as_result(b"aa").unwrap();
1728    assert_eq!(a, vec![b'a', b'a']);
1729
1730    let r = p.parse_as_result(b"aaa");
1731    assert!(r.is_err());
1732  }
1733
1734  #[test]
1735  fn test_count_sep() {
1736    init();
1737    let p1 = elm_ref(b'a');
1738    let p2 = elm_ref(b',');
1739    let p = p1.map(|e| *e).of_count_sep(3, p2);
1740
1741    let r = p.parse_as_result(b"a,a,a").unwrap();
1742    assert_eq!(r, vec![b'a', b'a', b'a']);
1743  }
1744
1745  #[test]
1746  fn test_seq() {
1747    init();
1748    let p = seq(b"abc");
1749
1750    let r = p.parse_as_result(b"abc").unwrap();
1751    assert_eq!(r, b"abc");
1752  }
1753
1754  #[test]
1755  fn test_tag() {
1756    init();
1757    let input = "abe".chars().collect::<Vec<char>>();
1758    let p = tag("abc").attempt() | tag("abe");
1759
1760    let r = p.parse(&input);
1761    println!("{:?}", r);
1762    assert_eq!(r.to_result().unwrap(), "abe");
1763  }
1764
1765  #[test]
1766  fn test_tag_no_case() {
1767    init();
1768    let input = "AbC".chars().collect::<Vec<char>>();
1769    let p = tag_no_case("abc");
1770
1771    let r = p.parse_as_result(&input).unwrap();
1772    assert_eq!(r, "abc");
1773  }
1774
1775  #[test]
1776  fn test_opt() {
1777    init();
1778    let p = seq(b"abc").opt();
1779
1780    if let Some(b) = p.parse_as_result(b"abc").unwrap() {
1781      assert_eq!(b, b"abc");
1782    } else {
1783      panic!()
1784    }
1785  }
1786
1787  #[test]
1788  fn test_not() {
1789    init();
1790    let p = seq(b"abc").not();
1791
1792    let _ = p.parse_as_result(b"def").unwrap();
1793  }
1794
1795  #[test]
1796  fn test_take() {
1797    init();
1798    let str = "abc";
1799    let str_len = str.len();
1800    let mut input = vec![str_len as u8];
1801    input.extend_from_slice(str.as_bytes());
1802
1803    // input: [u8; N]  = [ data size as u8 | data bytes ----- ]
1804
1805    let bytes_parser: Parser<u8, &[u8]> = take(1).flat_map(|size: &[u8]| take(size[0] as usize));
1806
1807    let ss = bytes_parser
1808      .parse(&input)
1809      .to_result()
1810      .map(|r| std::str::from_utf8(r).unwrap())
1811      .unwrap();
1812
1813    println!("{}", ss);
1814    assert_eq!(ss, str);
1815  }
1816
1817  #[test]
1818  fn test_take_2() {
1819    init();
1820    let input1 = "abcd".chars().collect::<Vec<char>>();
1821    let p = ((elm_ref('a') + elm_ref('b')).flat_map(|e| skip(1).map(move |_| e)) + elm_any_ref() + end())
1822      .collect()
1823      .map(|chars| String::from_iter(chars));
1824
1825    let result = p.parse_as_result(&input1).unwrap();
1826    log::debug!("result = {:?}", result);
1827  }
1828
1829  #[test]
1830  fn test_take_while0() {
1831    init();
1832    let p = take_while0(|c: &u8| c.is_ascii_digit()).map_res(std::str::from_utf8);
1833
1834    let result = p.parse_as_result(b"a123b");
1835    assert!(result.is_ok());
1836    assert_eq!(result.unwrap(), "123");
1837
1838    let result = p.parse_as_result(b"def");
1839    assert!(result.is_ok());
1840  }
1841
1842  #[test]
1843  fn test_take_while1() {
1844    init();
1845    let p = take_while1(|c: &u8| c.is_ascii_digit()).map_res(std::str::from_utf8);
1846
1847    let result = p.parse_as_result(b"a123b");
1848    assert!(result.is_ok());
1849    assert_eq!(result.unwrap(), "123");
1850
1851    let result = p.parse_as_result(b"def");
1852    assert!(result.is_err());
1853  }
1854
1855  #[test]
1856  fn test_take_while_n_m() {
1857    init();
1858    let p = take_while_n_m(1, 3, |c: &u8| c.is_ascii_digit()).map_res(std::str::from_utf8);
1859
1860    let result = p.parse_as_result(b"a1b");
1861    assert!(result.is_ok());
1862    assert_eq!(result.unwrap(), "1");
1863
1864    let result = p.parse_as_result(b"a12b");
1865    assert!(result.is_ok());
1866    assert_eq!(result.unwrap(), "12");
1867
1868    let result = p.parse_as_result(b"a123b");
1869    assert!(result.is_ok());
1870    assert_eq!(result.unwrap(), "123");
1871
1872    let result = p.parse_as_result(b"a1234b");
1873    assert!(result.is_err());
1874
1875    let result = p.parse_as_result(b"def");
1876    assert!(result.is_err());
1877  }
1878
1879  #[test]
1880  fn test_take_till0() {
1881    init();
1882    let p = take_till0(|c| *c == b'c').map_res(std::str::from_utf8);
1883
1884    let result = p.parse_as_result(b"abcd");
1885    assert!(result.is_ok());
1886    assert_eq!(result.unwrap(), "abc");
1887
1888    //   let result = p.parse_as_result(b"def");
1889    //  assert!(result.is_ok());
1890  }
1891
1892  #[test]
1893  fn test_take_till1() {
1894    init();
1895    let p = take_till1(|c| *c == b'c').map_res(std::str::from_utf8);
1896
1897    let result = p.parse_as_result(b"abcd");
1898    assert!(result.is_ok());
1899    assert_eq!(result.unwrap(), "abc");
1900
1901    // let result = p.parse_as_result(b"def");
1902    // assert!(result.is_err());
1903  }
1904
1905  #[test]
1906  fn test_discard() {
1907    init();
1908    let p = seq(b"abc").discard();
1909
1910    let result = p.parse_as_result(b"abc");
1911    assert!(result.is_ok());
1912
1913    let result = p.parse_as_result(b"def");
1914    assert!(result.is_err());
1915  }
1916
1917  #[test]
1918  fn test_and_then() {
1919    init();
1920    let pv1 = b'a';
1921    let pv2 = b'b';
1922    let p = elm_ref(pv1) + elm_ref(pv2);
1923
1924    let result = p.parse_as_result(b"ab").unwrap();
1925    log::debug!("result = {:?}", result);
1926    let (a, b) = result;
1927    assert_eq!(*a, pv1);
1928    assert_eq!(*b, pv2);
1929  }
1930
1931  #[test]
1932  fn test_last_offset() {
1933    init();
1934    let pv1 = b'a';
1935    let pv2 = b'b';
1936    let p1 = elm_ref(pv1);
1937    let p2 = elm_ref(pv2);
1938    let p = (p1 + p2).last_offset();
1939
1940    let result = p.parse_as_result(b"ab").unwrap();
1941    log::debug!("result = {:?}", result);
1942    //  let (a, b) = result;
1943    //  assert_eq!(a, pv1);
1944    //  assert_eq!(b, pv2);
1945  }
1946
1947  #[test]
1948  fn test_or() {
1949    init();
1950    let pv1 = b'a';
1951    let pv2 = b'b';
1952    let p = elm_ref(pv1) | elm_ref(pv2);
1953
1954    let result = p.parse_as_result(b"ab").unwrap();
1955    log::debug!("result = {:?}", result);
1956    assert_eq!(*result, pv1);
1957
1958    let result = p.parse_as_result(b"ba").unwrap();
1959    log::debug!("result = {:?}", result);
1960    assert_eq!(*result, pv2);
1961  }
1962
1963  #[test]
1964  fn test_skip_left() {
1965    init();
1966    let pv1 = b'a';
1967    let pv2 = b'b';
1968    let p = elm_ref(pv1) * elm_ref(pv2);
1969
1970    let result = p.parse_as_result(b"ab").unwrap();
1971    log::debug!("result = {:?}", result);
1972    assert_eq!(*result, pv2);
1973  }
1974
1975  #[test]
1976  fn test_skip_right() {
1977    init();
1978    let pv1 = b'a';
1979    let pv2 = b'b';
1980    let p1 = elm_ref(pv1);
1981    let p2 = elm_ref(pv2);
1982    let p = p1 - p2;
1983
1984    let result = p.parse_as_result(b"ab").unwrap();
1985    log::debug!("result = {:?}", result);
1986    assert_eq!(*result, pv1);
1987  }
1988
1989  #[test]
1990  fn test_example1() {
1991    init();
1992    let input1 = "abc".chars().collect::<Vec<char>>();
1993    let input2 = "abd".chars().collect::<Vec<char>>();
1994
1995    let pa = elm_ref('a');
1996    let pb = elm_ref('b');
1997    let pc = elm_ref('c');
1998    let pd = elm_ref('d');
1999    let p = (pa + pb + (pc | pd)).collect().map(String::from_iter);
2000
2001    let result = p.parse_as_result(&input1).unwrap();
2002    log::debug!("result = {}", result);
2003    assert_eq!(result, "abc");
2004
2005    let result = p.parse_as_result(&input2).unwrap();
2006    log::debug!("result = {}", result);
2007    assert_eq!(result, "abd");
2008  }
2009
2010  #[test]
2011  fn test_example2() {
2012    init();
2013
2014    let input = "aname".chars().collect::<Vec<char>>();
2015    let p = (elm_ref('a') + tag("name")).collect().map(String::from_iter);
2016
2017    let result = p.parse_as_result(&input).unwrap();
2018    // let s: String = result.iter().collect();
2019    log::debug!("result = {:?}", result);
2020    // assert_eq!(s, "aname");
2021  }
2022
2023  #[test]
2024  fn test_filter() {
2025    init();
2026    {
2027      let input: Vec<char> = "abc def".chars().collect::<Vec<char>>();
2028      let p1 = tag("abc") * elm_ref(' ').map(|e| *e).of_many1() - tag("def");
2029      let p2 = p1.with_filter(|chars| chars.len() > 1);
2030      let result: Result<Vec<char>, ParseError<char>> = p2.parse_as_result(&input);
2031      assert!(result.is_err());
2032    }
2033    {
2034      let input: Vec<char> = "abc  def".chars().collect::<Vec<char>>();
2035      let p1 = tag("abc") * elm_ref(' ').map(|e| *e).of_many1() - tag("def");
2036      let p2 = p1.with_filter(|chars| chars.len() > 1);
2037      let result: Result<Vec<char>, ParseError<char>> = p2.parse_as_result(&input);
2038      assert!(result.is_ok());
2039    }
2040  }
2041
2042  #[test]
2043  fn test_filter_not() {
2044    init();
2045    {
2046      let input: Vec<char> = "abc def".chars().collect::<Vec<char>>();
2047      let p1 = tag("abc") * elm_ref(' ').map(|e| *e).of_many1() - tag("def");
2048      let p2 = p1.with_filter_not(|chars| chars.len() > 1);
2049      let result: Result<Vec<char>, ParseError<char>> = p2.parse_as_result(&input);
2050      assert!(result.is_ok());
2051    }
2052    {
2053      let input: Vec<char> = "abc  def".chars().collect::<Vec<char>>();
2054      let p1 = tag("abc") * elm_ref(' ').map(|e| *e).of_many1() - tag("def");
2055      let p2 = p1.with_filter_not(|chars| chars.len() > 1);
2056      let result: Result<Vec<char>, ParseError<char>> = p2.parse_as_result(&input);
2057      assert!(result.is_err());
2058    }
2059  }
2060}