public void TestWrap() { var s = PrinterMonad.Wrap("test"); // note: AWKWARD // run test and watch debug prompt to see if working // should print 'test' three times s("input"); s("test"); s("a"); }
public void TestFlatten() { var r = new List <PrinterMonad <int> >(); PrinterMonad <PrinterMonad <int> > p = r.Add; var q = p.Flatten(); // note: AWKWARD // can't really verify what the printers are, just that they were made and inserted r.Count.AssertEquals(0); q(5); r.Count.AssertEquals(1); q(6); r.Count.AssertEquals(2); }
public void TestTransform() { var r = new List <string>(); PrinterMonad <string> p = r.Add; // note: BROKEN, goes backwards from string to int, instead of forward from int to string var q = p.Transform <int, string>(e => e + ""); r.SequenceEqual(new string[0]).AssertTrue(); q(5); r.SequenceEqual(new[] { "5" }).AssertTrue(); q(8); r.SequenceEqual(new[] { "5", "8" }).AssertTrue(); }
/// <summary> /// Returns a printer that transforms values into a printer then prints that printer with the given printer printer. /// /// AWKWARD: The intermediate printer inherits awkwardness from Wrap's awkwardness. /// </summary> public static PrinterMonad <T> Flatten <T>(this PrinterMonad <PrinterMonad <T> > printerOfPrinter) { return(input => printerOfPrinter(Wrap(input))); }
/// <summary> /// Returns a parser that uses the given parser but transforms its resulting value with the given transformation. /// /// BROKEN: The transformation goes backwards! The resulting printer expects values of type TIn instead of TOut. /// </summary> public static PrinterMonad <TIn> Transform <TIn, TOut>(this PrinterMonad <TOut> printer, Func <TIn, TOut> transformation) { return(input => printer(transformation(input))); }