pub fn parse_delimited_block<I, O1, O2, O3, E: ParseError<I>, F, G, H>(
start: F,
end: G,
parser: H
) -> impl Fn(I) -> IResult<I, O3, E> where
I: Clone + InputIter + InputTake,
F: Fn(I) -> IResult<I, O1, E>,
G: Fn(I) -> IResult<I, O2, E>,
H: Fn(I) -> IResult<I, O3, E>,
use std::str::FromStr;
use nom::bytes::complete::tag;
use nom::character::complete::digit0;
use nom::combinator::map;
use nom::Err;
use nom::error::{ErrorKind, ParseError};
use mshio::parsers::parse_delimited_block;
let parser = parse_delimited_block::<_,_,_,_,(_,_),_,_,_>(tag("$Start\n"), tag("$End\n"), map(digit0, FromStr::from_str));
assert_eq!(parser("$Start\n123\n$End\n456"), Ok(("456", Ok(123))));
assert_eq!(parser("$Start\n123\n$End\n"), Ok(("", Ok(123))));
assert_eq!(parser("$Start\n$End\n"), Ok(("", i32::from_str(""))));