1use crate::prelude::*;
2use super::{ stateful, stateless, Input, ParserPhantom, Result, Success };
3
4#[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}