Example #1
0
    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"));
    }
Example #2
0
 /// <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);
     });
 }
Example #3
0
 /// <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);
     });
 }
Example #4
0
    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"));
    }
Example #5
0
    public void TestWrap()
    {
        var s = ParserMonad.Wrap("test");

        s("whatever").AssertEquals(Tuple.Create("test", "whatever"));
    }