public void TestTransform() { ParserMonad <int> p = text => Tuple.Create(int.Parse(text.Substring(0, 5)), text.Substring(5)); var q = p.Transform(e => e * e); q("00005wonder").AssertEquals(Tuple.Create(25, "wonder")); }
/// <summary> /// Returns a parser that uses the given parser to parse an intermediate parser, /// then immediately applies that intermediate parser to the remaining text, /// then returns the resulting value and final remaining text. /// </summary> public static ParserMonad <T> Flatten <T>(this ParserMonad <ParserMonad <T> > parserOfParser) { return(text => { var mid = parserOfParser(text); var parser = mid.Item1; var remainingText = mid.Item2; return parser(remainingText); }); }
/// <summary> /// Returns a parser that uses the given parser but transforms its resulting value with the given transformation. /// </summary> public static ParserMonad <TOut> Transform <TIn, TOut>(this ParserMonad <TIn> parser, Func <TIn, TOut> transformation) { return(text => { var mid = parser(text); var value = mid.Item1; var remainingText = mid.Item2; var result = transformation(value); return Tuple.Create(result, remainingText); }); }
public void TestFlatten() { ParserMonad <ParserMonad <int> > p = text => { var first = text[0]; if (first == 'a') { return(Tuple.Create <ParserMonad <int>, string>( rest => Tuple.Create(int.Parse(rest.Substring(0, 5)), rest.Substring(5)), text.Substring(1))); } return(Tuple.Create(ParserMonad.Wrap(-1), text.Substring(1))); }; var q = p.Flatten(); q("a00004x").AssertEquals(Tuple.Create(4, "x")); q("b00004x").AssertEquals(Tuple.Create(-1, "00004x")); }
public void TestWrap() { var s = ParserMonad.Wrap("test"); s("whatever").AssertEquals(Tuple.Create("test", "whatever")); }