Advertisement
Guest User

X DSL

a guest
May 13th, 2013
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.16 KB | None | 0 0
  1. public class X : DynamicObject
  2. {
  3.     List<XElement> xsiblings = new List<XElement>();
  4.     XElement xwrapper;
  5.     XElement xplace;
  6.  
  7.     Dictionary<string, Func<X>> customOperators = new Dictionary<string, Func<X>>();
  8.  
  9.     private Func<X> Down
  10.     {
  11.         get { return () => new X(xplace) { xplace = xplace }; }
  12.     }
  13.  
  14.     private Func<X> Up
  15.     {
  16.         get
  17.         {
  18.             var parent = xplace.Parent ?? xplace;
  19.             parent = parent.Parent ?? parent;
  20.             return () => new X(parent) { xplace = xplace.Parent };
  21.         }
  22.     }
  23.  
  24.     private Func<X> Self
  25.     {
  26.         get { return () => new X(this);  }
  27.     }
  28.  
  29.     public static dynamic _{ get { return New; } }
  30.  
  31.     public static dynamic New
  32.     {
  33.         get
  34.         {
  35.             Func<dynamic> exp = () =>
  36.             {
  37.                 var b = new X();
  38.                 return (dynamic)b;
  39.             };
  40.             return exp.Invoke();
  41.         }
  42.     }
  43.  
  44.     protected void init()
  45.     {
  46.         customOperators.Add(">", () => Down());
  47.         customOperators.Add("<", () => Up());
  48.         customOperators.Add("+", () => Self());
  49.         customOperators.Add("_", () => _);
  50.     }
  51.  
  52.     public X(){
  53.         xwrapper = new XElement("Wrapper");
  54.         xplace = xwrapper;
  55.         init();
  56.     }
  57.  
  58.     public X(XElement xelem)
  59.     {
  60.         xwrapper = xelem;
  61.         xplace = xwrapper.Descendants().LastOrDefault() ?? xwrapper;
  62.         init();
  63.     }
  64.  
  65.     public X(X builder)
  66.     {
  67.         xwrapper = builder.xwrapper;
  68.         xplace = xwrapper.Descendants().LastOrDefault() ?? xwrapper;
  69.         init();
  70.     }
  71.  
  72.     public X(X builder1, X builder2)
  73.     {
  74.         builder1.xplace.Add(builder2.xwrapper);
  75.         builder2.xplace = builder1.xplace;
  76.         init();
  77.     }
  78.  
  79.     public override string ToString()
  80.     {
  81.         return xwrapper.ToString();
  82.     }
  83.  
  84.     public static X operator +(X c1, X c2)
  85.     {
  86.         c1.xwrapper.Add(c2.xwrapper.Descendants());
  87.         return c1;
  88.     }
  89.  
  90.     public static X operator >(X c1, X c2)
  91.     {
  92.         var xlast = c1.xplace.Descendants().LastOrDefault();
  93.         xlast = xlast ?? c1.xplace;
  94.         xlast.Add(c2.xwrapper.Descendants());
  95.         return c1;
  96.     }
  97.  
  98.     public static X operator <(X c1, X c2)
  99.     {
  100.         var xlast = c1.xplace.Parent.Descendants().LastOrDefault();
  101.         xlast = xlast ?? c1.xplace;
  102.         var parent = xlast.Parent ?? xlast;
  103.         parent = parent.Parent ?? parent;
  104.         parent.Add(c2.xwrapper.Descendants());
  105.         return c1;
  106.     }
  107.  
  108.     public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
  109.     {
  110.             return base.TryInvoke(binder, args, out result);
  111.     }
  112.  
  113.     public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
  114.     {
  115.         result = default(object);
  116.  
  117.         if (customOperators.ContainsKey(binder.Name))
  118.             result = customOperators[binder.Name]();
  119.         else //build with this call
  120.         {
  121.             var work = new Func<object>(() =>
  122.             {
  123.                 var diff = args.Count() - binder.CallInfo.ArgumentNames.Count;
  124.                 var innerText = string.Empty;
  125.                 var argQueue = new Queue<object>(args);
  126.                 if (diff > 0)
  127.                     diff.Times(i => innerText += argQueue.Dequeue().ToString());
  128.  
  129.                 args = argQueue.ToArray();
  130.                 var parameters = new Dictionary<string, object>();
  131.                 binder.CallInfo.ArgumentNames.Count().Times(i =>
  132.                 {
  133.                     parameters.Add(binder.CallInfo.ArgumentNames[i], args[i]);
  134.                 });
  135.  
  136.                 XElement xelem = new XElement(binder.Name,
  137.                     parameters.ToList().Select(param => new XAttribute(param.Key, param.Value)));
  138.                 xelem.Add(innerText);
  139.                 xplace = xelem;
  140.                 return xelem;
  141.             });
  142.             var output = work.DynamicInvoke() as XElement;
  143.             xwrapper.Add(output);
  144.             result = this;
  145.         }
  146.         return true;
  147.     }
  148.  
  149.     public X this[string key]
  150.     {
  151.         get { return customOperators[key](); }
  152.     }
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement