wiwi/parser/
util.rs

1use crate::prelude::*;
2use super::{ stateful, stateless, Input, ParserPhantom, Result, Success };
3
4/// Wraps an implementor of [`Parser`](stateless::Parser) and provides an implementation
5/// of [`ParserStateful`](stateful::ParserStateful)
6#[inline]
7pub fn adapt_stateful<P, I, O, E>(parser: P) -> AdaptStateful<P, I, O, E>
8where
9	I: Input,
10	P: stateless::Parser<I, O, E>
11{
12	AdaptStateful { parser, __marker: PhantomData }
13}
14
15#[inline]
16pub(super) fn map<P, F, O>(parser: P, map: F) -> Map<P, F, O> {
17	Map { parser, map, __marker: PhantomData }
18}
19
20#[repr(transparent)]
21pub struct AdaptStateful<P, I, O, E>
22where
23	I: Input
24{
25	parser: P,
26	__marker: ParserPhantom<I, O, E>
27}
28
29impl<P, I, O, E> stateful::ParserStateful<I, O, E> for AdaptStateful<P, I, O, E>
30where
31	I: Input,
32	P: stateless::Parser<I, O, E>
33{
34	#[inline]
35	fn parse(&mut self, input: I) -> Result<I, O, E> {
36		self.parser.parse(input)
37	}
38}
39
40pub struct Map<P, F, O> {
41	parser: P,
42	map: F,
43	__marker: PhantomData<fn(O) -> O>
44}
45
46impl<P, I, O, E, F, O2> stateless::Parser<I, O2, E> for Map<P, F, O>
47where
48	I: Input,
49	P: stateless::Parser<I, O, E>,
50	F: Fn(O) -> O2
51{
52	#[inline]
53	fn parse(&self, input: I) -> Result<I, O2, E> {
54		self.parser.parse(input).map(|Success { output, remaining_input }| {
55			Success { output: (self.map)(output), remaining_input }
56		})
57	}
58}
59
60impl<P, I, O, E, F, O2> stateful::ParserStateful<I, O2, E> for Map<P, F, O>
61where
62	I: Input,
63	P: stateful::ParserStateful<I, O, E>,
64	F: FnMut(O) -> O2
65{
66	#[inline]
67	fn parse(&mut self, input: I) -> Result<I, O2, E> {
68		self.parser.parse(input).map(|Success { output, remaining_input }| {
69			Success { output: (self.map)(output), remaining_input }
70		})
71	}
72}