add some more combinators

master
Andrew Johnson 6 years ago
parent b5de8cf14f
commit ca65d2d30b

@ -47,12 +47,30 @@ fn parse_satisfy<St,T>(t: T) -> impl (Fn(Box<ParseState<St>>) -> ParseRCon<Box<P
parse_token(move |c| if t(c) {Some(c)} else {None})
}
fn parse_return<St,A: Clone>(a: A) -> impl (Fn(Box<ParseState<St>>) -> ParseRCon<Box<ParseState<St>>,A>) {
move |st| { ParseRCon(st,Ok(Some(a.clone()))) }
}
fn parse_bind<St,A,B,P1,P2,B1>(p1: P1, b1: B1)
-> impl Fn(Box<ParseState<St>>) -> ParseRCon<Box<ParseState<St>>,B>
where P1: Fn(Box<ParseState<St>>) -> ParseRCon<Box<ParseState<St>>,A>,
P2: Fn(Box<ParseState<St>>) -> ParseRCon<Box<ParseState<St>>,B>,
B1: Fn(A) -> P2 {
move |st| {
match p1(st) {
ParseRCon(nst,Ok(Some(a))) => b1(a)(nst),
ParseRCon(nst,Ok(None)) => ParseRCon(nst,Err("bind failed".to_string())),
ParseRCon(nst,Err(err)) => ParseRCon(nst,Err(err))
}
}
}
fn mzero<St,A>(st: Box<ParseState<St>>) -> ParseRCon<Box<ParseState<St>>,A> {
ParseRCon(st,Err("mzero".to_string()))
}
/*
TODO
val return : 'a -> ('st, 'a) parser
val (>>=) : ('st, 'a) parser -> ('a -> ('st, 'b) parser) ->
('st, 'b) parser
val mzero : ('st, 'a) parser
val mplus : ('st, 'a) parser -> ('st, 'a) parser ->
('st, 'a) parser
val (>>) : ('st, 'a) parser -> ('st, 'b) parser ->

Loading…
Cancel
Save