diff options
| author | John Turner <jturner.usa@gmail.com> | 2025-10-24 00:09:02 -0400 |
|---|---|---|
| committer | John Turner <jturner.usa@gmail.com> | 2025-10-24 00:09:02 -0400 |
| commit | 675b511c836163efee201fc0bb9ca67d1db28823 (patch) | |
| tree | cedbb839876383d91ef7f639703b157c9c5f2ebb /src/lib.rs | |
| parent | 60f8e11769864befc1f116f5f2896cdbf16609f1 (diff) | |
| download | mon-675b511c836163efee201fc0bb9ca67d1db28823.tar.gz | |
short circuit Or combinator instead of running both parsers
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 17 |
1 files changed, 9 insertions, 8 deletions
@@ -296,14 +296,15 @@ where ) -> ParserResult<I, Self::Output, OM, EM> { Tracer::trace("or", it.clone()); - match ( - self.left.run::<OM, EM, Tracer>(it.clone()), - self.right.run::<OM, EM, Tracer>(it.clone()), - ) { - (Ok((rest, output)), _) => Ok((rest, output)), - (_, Ok((rest, output))) => Ok((rest, output)), - (_, Err(rest)) => Err(rest), - } + if let Ok((rest, output)) = self.left.run::<OM, EM, Tracer>(it.clone()) { + return Ok((rest, output)); + }; + + if let Ok((rest, output)) = self.right.run::<OM, EM, Tracer>(it.clone()) { + return Ok((rest, output)); + }; + + Err(EM::bind(|| it)) } } |
