Advertisement
Guest User

Lamba-Pin Code Generator

a guest
Mar 4th, 2011
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.93 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6.  
  7. namespace CodeGenerator.Vapor.Core
  8. {
  9.     sealed class LambdaPin : ICodeGenerator
  10.     {
  11.         public string OutputPath
  12.         {
  13.             get { return "Core/Lambda-Pin.cs"; }
  14.         }
  15.  
  16.         public void WriteTo(TextWriter file)
  17.         {          
  18.             file.WriteLine("// Generated by \"CodeGenerator/Vapor.Core/Lambda-Pin.cs\"");
  19.             file.WriteLine("//  DO NOT MAKE CHANGES TO THIS FILE, AS THEY WILL BE DISCARDED!");
  20.             file.WriteLine("using System;");
  21.             file.WriteLine();
  22.             file.WriteLine("namespace Vapor");
  23.             file.WriteLine("{");
  24.             file.WriteLine("\tpublic static partial class Lambda");
  25.             file.WriteLine("\t{");
  26.  
  27.             for (int i = 1; i <= 16; ++i)
  28.             {
  29.                 if (i == 5)
  30.                     file.WriteLine("\t\t#if !COMPACT_FRAMEWORK");
  31.                 file.WriteLine(MakePinAction(i));
  32.                 file.WriteLine(MakePinFunc(i));
  33.             }
  34.             file.WriteLine("\t\t#endif//!COMPACT_FRAMEWORK");
  35.  
  36.             file.WriteLine("\t}");
  37.             file.WriteLine("}");
  38.         }
  39.  
  40.         private static string MakePinAction(int args)
  41.         {
  42.             var builder = new StringBuilder();
  43.             builder.Append("\t\tpublic static Action Pin<");
  44.             for (int i = 0; i < args; ++i)
  45.                 builder.AppendFormat("T{0}, ", i);
  46.             builder.Remove(builder.Length - 2, 2);
  47.             builder.AppendLine(">");
  48.  
  49.             builder.AppendLine("\t\t\t(");
  50.  
  51.             builder.Append("\t\t\t\tthis Action<");
  52.             for (int i = 0; i < args; ++i)
  53.                 builder.AppendFormat("T{0}, ", i);
  54.             builder.Remove(builder.Length - 2, 2);
  55.             builder.AppendLine("> action,");
  56.  
  57.             for (int i = 0; i < args - 1; ++i)
  58.                 builder.AppendFormat("\t\t\t\tT{0} arg{0},\r\n", i);
  59.             builder.AppendFormat("\t\t\t\tT{0} arg{0}\r\n", args - 1);
  60.  
  61.             builder.AppendLine("\t\t\t)");
  62.  
  63.             builder.AppendLine("\t\t{");
  64.  
  65.             builder.AppendFormat("\t\t\treturn () => action(");
  66.             for (int i = 0; i < args; ++i)
  67.                 builder.AppendFormat("arg{0}, ", i);
  68.             builder.Remove(builder.Length - 2, 2);
  69.             builder.AppendLine(");");
  70.  
  71.             builder.AppendLine("\t\t}");
  72.  
  73.             return builder.ToString();
  74.         }
  75.  
  76.         private static string MakePinFunc(int args)
  77.         {
  78.             Func<string, string, string> genString = (format, seperator) =>
  79.                 {
  80.                     return Generate.SeperateString(
  81.                         Generate.Sequence(args),
  82.                         format,
  83.                         seperator);
  84.                 };
  85.  
  86.             var builder = new StringBuilder();
  87.             builder.Append("\t\tpublic static Func<TResult> Pin<");
  88.             builder.Append(genString("T{0}", ", "));
  89.             builder.AppendLine(", TResult>");
  90.  
  91.             builder.AppendLine("\t\t\t(");
  92.  
  93.             builder.Append("\t\t\t\tthis Func<");
  94.             builder.Append(genString("T{0}", ", "));
  95.             builder.AppendLine(", TResult> func,");
  96.  
  97.             builder.AppendLine(genString("\t\t\t\tT{0} arg{0}", ",\r\n"));
  98.             builder.AppendLine("\t\t\t)");
  99.  
  100.             builder.AppendLine("\t\t{");
  101.  
  102.             builder.AppendFormat("\t\t\treturn () => func(");
  103.             builder.Append(genString("arg{0}", ", "));
  104.             builder.AppendLine(");");
  105.  
  106.             builder.AppendLine("\t\t}");
  107.  
  108.             return builder.ToString();
  109.         }
  110.     }
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement