PageRenderTime 61ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/System.Reactive/System.Reactive.Joins/gen/gen-code.cs

https://github.com/gshackles/mono-reactive
C# | 104 lines | 98 code | 6 blank | 0 comment | 3 complexity | 83b88822e68ef5603bb9d47ee6a05727 MD5 | raw file
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. public class CodeGen
  5. {
  6. public static void Main ()
  7. {
  8. Console.WriteLine (@"
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Linq.Expressions;
  13. using System.Reactive;
  14. using System.Reactive.Disposables;
  15. using System.Reactive.Linq;
  16. using System.Reactive.Subjects;
  17. namespace System.Reactive.Joins
  18. {");
  19. for (int i = 2; i <= 16; i++) {
  20. string s = String.Join (", ", (from t in Enumerable.Range (1, i) select "T" + t).ToArray ());
  21. string s2 = String.Join (", ", (from t in Enumerable.Range (1, i) select "IObservable<T" + t + "> t" + t).ToArray ());
  22. string s3 = String.Join (", ", (from t in Enumerable.Range (1, i) select "t" + t).ToArray ());
  23. string s4 = String.Join ("\t\t", (from t in Enumerable.Range (1, i) select "IObservable<T" + t + "> t" + t + ";\n").ToArray ());
  24. string s5 = String.Join ("\n\t\t\t", (from t in Enumerable.Range (1, i) select "this.t" + t + " = t" + t + ";").ToArray ());
  25. string s6 = String.Join ("\n\t\t\t", (from t in Enumerable.Range (1, i) select "var q" + t + " = new Queue<T" + t + "> ();").ToArray ());
  26. string s7 = null;
  27. foreach (var t in Enumerable.Range (1, i)) {
  28. string s8 = String.Join (" && ", (from t2 in Enumerable.Range (1, i) select "q" + t2 + ".Count > 0").ToArray ());
  29. string s9 = String.Join (", ", (from t2 in Enumerable.Range (1, i) select "q" + t2 + ".Dequeue ()").ToArray ());
  30. s7 += String.Format (@"
  31. t{0}.Subscribe (Observer.Create<T{0}> (t => {{
  32. q{0}.Enqueue (t);
  33. if ({1})
  34. sub.OnNext (selector ({2}));
  35. }}, (ex) => sub.OnError (ex), () => {{
  36. done [{3}] = true;
  37. if (done.All (b => b))
  38. sub.OnCompleted ();
  39. }}));
  40. ", t, s8, s9, t - 1);
  41. }
  42. Console.Write (@"
  43. public class Pattern<{0}> : Pattern
  44. {{
  45. internal Pattern ({2})
  46. {{
  47. {5}
  48. }}
  49. {4}
  50. {6}
  51. public Pattern<{0}, T{1}> And<T{1}> (IObservable<T{1}> other)
  52. {{
  53. return new Pattern<{0}, T{1}> ({3}, other);
  54. }}
  55. {7}
  56. public Plan<TResult> Then<TResult> (Func<{0}, TResult> selector)
  57. {{
  58. return new Plan<{0}, TResult> (this, selector);
  59. }}
  60. internal IObservable<TResult> AsObservable<TResult> (Func<{0}, TResult> selector)
  61. {{
  62. var sub = new Subject<TResult> ();
  63. bool [] done = new bool [{8}];
  64. {9}
  65. {10}
  66. return sub;
  67. }}
  68. }}
  69. internal class Plan<{0}, TResult> : Plan<TResult>
  70. {{
  71. Pattern<{0}> pattern;
  72. Func<{0}, TResult> selector;
  73. public Plan (Pattern<{0}> pattern, Func<{0}, TResult> selector)
  74. {{
  75. this.pattern = pattern;
  76. this.selector = selector;
  77. }}
  78. internal override IObservable<TResult> AsObservable ()
  79. {{
  80. return pattern.AsObservable<TResult> (selector);
  81. }}
  82. }}
  83. ", s, i + 1, s2, s3, s4, s5, i == 16 ? "/*" : null, i == 16 ? "*/" : null, i, s6, s7);
  84. }
  85. Console.WriteLine (@"
  86. }");
  87. }
  88. }