Advertisement
Guest User

Untitled

a guest
Mar 15th, 2011
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.99 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. using Environment = System.Collections.Generic.Dictionary<int, string>;
  6.  
  7. interface IFormlet<T>
  8. {
  9.     string Render();
  10.     T Evaluate(Environment env);
  11. }
  12.  
  13. class Input<T> : IFormlet<T>
  14. {
  15.     readonly int id;
  16.     readonly Func<string, T> parser;
  17.  
  18.     public Input(int id, Func<string, T> parser)
  19.     {
  20.         this.id = id;
  21.         this.parser = parser;
  22.     }
  23.     public string Render()
  24.     {
  25.         return "Input #{0} lol".Format(this.id);
  26.     }
  27.  
  28.     public T Evaluate(Environment env)
  29.     {
  30.         return this.parser(env[this.id]);
  31.     }
  32. }
  33.  
  34. class Composition<T1, T2, TR> : IFormlet<TR>
  35. {
  36.     readonly IFormlet<T1> f1;
  37.     readonly IFormlet<T2> f2;
  38.     readonly Func<T1, T2, TR> evaluator;
  39.  
  40.     public Composition(IFormlet<T1> f1, IFormlet<T2> f2, Func<T1, T2, TR> evaluator)
  41.     {
  42.         this.f1 = f1;
  43.         this.f2 = f2;
  44.         this.evaluator = evaluator;
  45.     }
  46.  
  47.     public string Render()
  48.     {
  49.         return f1.Render() + "; " + f2.Render();
  50.     }
  51.  
  52.     public TR Evaluate(Dictionary<int, string> env)
  53.     {
  54.         return evaluator(f1.Evaluate(env), f2.Evaluate(env));
  55.     }
  56. }
  57.  
  58. class Composition2<TSource, TIntermediate, TResult> : IFormlet<TResult>
  59. {
  60.     readonly IFormlet<TSource> f1;
  61.     readonly Func<TSource, IFormlet<TIntermediate>> collectionSelector;
  62.     readonly Func<TSource, TIntermediate, TResult> resultSelector;
  63.  
  64.     public Composition2(
  65.         IFormlet<TSource> f1,
  66.         Func<TSource, IFormlet<TIntermediate>> collectionSelector,
  67.         Func<TSource, TIntermediate, TResult> resultSelector)
  68.     {
  69.         this.f1 = f1;
  70.         this.collectionSelector = collectionSelector;
  71.         this.resultSelector = resultSelector;
  72.     }
  73.  
  74.     public string Render()
  75.     {
  76.         return f1.Render(); // can't do anything more!
  77.     }
  78.  
  79.     public TResult Evaluate(Dictionary<int, string> env)
  80.     {
  81.         var r1 = f1.Evaluate(env);
  82.         // Only here we get the second IFormlet,
  83.         // only after we calculated r1.
  84.         var f2 = collectionSelector(r1);
  85.         var r2 = f2.Evaluate(env);
  86.         return resultSelector(r1, r2);
  87.     }
  88. }
  89.  
  90. static class Extensions
  91. {
  92.     public static string Format(this string format, params object[] args)
  93.     {
  94.         return String.Format(format, args);
  95.     }
  96.  
  97.     public static IFormlet<TR> Join<T1, T2, TKey, TR>(
  98.         this IFormlet<T1> f1,
  99.         IFormlet<T2> f2,
  100.         Func<T1, TKey> selector1,
  101.         Func<T2, TKey> selector2,
  102.         Func<T1, T2, TR> resultSelector)
  103.     {
  104.         Console.WriteLine("Composing '{0}' + '{1}'".Format((object)f1.Render(), f2.Render()));
  105.         return new Composition<T1, T2, TR>(f1, f2, resultSelector);
  106.     }
  107.  
  108.     public static IFormlet<TResult> SelectMany<TSource, TIntermediate, TResult>(
  109.         this IFormlet<TSource> f1,
  110.         Func<TSource, IFormlet<TIntermediate>> collectionSelector,
  111.         Func<TSource, TIntermediate, TResult> resultSelector)
  112.     {
  113.         return new Composition2<TSource, TIntermediate, TResult>(f1, collectionSelector, resultSelector);
  114.     }
  115. }
  116.  
  117. public class JustTest1
  118. {
  119.  
  120.     public static void Main()
  121.     {
  122.         var env = new Environment() { { 1, "11" }, { 2, "22" }, { 3, "33" } };
  123.  
  124.         var composed =
  125.             from x in new Input<int>(1, s => int.Parse(s))
  126.             join y in new Input<int>(2, s => int.Parse(s)) on 1 equals 1
  127.             join z in new Input<int>(3, s => int.Parse(s)) on 1 equals 1
  128.             select "Result: {0}, {1}, {2}".Format(x, y, z);
  129.  
  130.         Console.WriteLine(composed.Render());
  131.         Console.WriteLine(composed.Evaluate(env));
  132.  
  133.         var composed2 =
  134.             from x in new Input<int>(1, s => int.Parse(s))
  135.             from y in new Input<int>(2, s => int.Parse(s))
  136.             from z in new Input<int>(3, s => int.Parse(s))
  137.             select "Result: {0}, {1}, {2}".Format(x, y, z);
  138.         Console.WriteLine(composed2.Render());
  139.         Console.WriteLine(composed2.Evaluate(env));
  140.     }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement