public static TronicSequence StartFromReciever(DataNodeIn Channel, DataNodeOut Username, DataNodeOut Message, N8BlockFactory Blocks = null, string name = "Reciever")
        {
            TronicSequence ts = new TronicSequence(Blocks);
            ts.Button(1, "Reciever Setup")
              .RadioReciever(Channel, Username, Message, name);

            return ts;
        }
        public static TronicSequence StartFromKeyboard(N8BlockFactory Blocks = null, DataNodeOut DataOut = null, string name = "Keyboard")
        {
            TronicSequence ts = new TronicSequence(Blocks);
            //I just learned about the null coalsece operator! it is awesome.
            ts.Keyboard(DataOut ?? ts.NewDataBlock().Out, name);

            if (!ts.data.Contains(DataOut.Parent))
            {
                ts.data.Add(DataOut.Parent);
            }

            return ts;
        }
        protected TronicSequence Keyboard(DataNodeOut Out, string name = "Keyboard")
        {
            Keyboard k = tronics.Keyboard(name);
            k.DataOutA(Out);
            CurrentTronic = k;
            CurrentOut = k.GetNode(NodeType.FlowOutA);
            sequence.Add(k);

            return this;
        }
        private void WireArithmeticNode(FlowTronic next, DataNodeIn DataInA, DataNodeIn DataInB, DataNodeOut DataOut, NodeType NextOut = NodeType.FlowOutA)
        {
            next.DataInA(DataInA);
            next.DataInB(DataInB);
            next.DataOutA(DataOut);

            Append(next, next.GetNode(NextOut));
        }
        public TronicSequence Rotor(DataNodeIn DataInA, DataNodeOut DataOutA, string name = "Rotor")
        {
            CheckCanAppend();

            FlowTronic NextTronic = tronics.Rotor(name);

            NextTronic.DataInA(DataInA);
            NextTronic.DataOutA(DataOutA);

            Append(NextTronic, NextTronic.GetNode(NodeType.FlowOutA));
            return this;
        }
        public TronicSequence Subtract(DataNodeIn DataInA, DataNodeIn DataInB, DataNodeOut DataOut, string name = "Subtractor")
        {
            CheckCanAppend();
            FlowTronic NextTronic = tronics.Subtract(name);

            WireArithmeticNode(NextTronic, DataInA, DataInB, DataOut);

            return this;
        }
        public TronicSequence RadioReciever(DataNodeIn Channel, DataNodeOut Username, DataNodeOut Message, string name = "Reciever")
        {
            Reciever r = tronics.Reciever(name);
            r.DataInA(Channel);
            r.DataOutB(Username);
            r.DataOutA(Message);
            Append(r, r.GetNode(NodeType.FlowOutA));

            return this;
        }
        public TronicSequence Rand(DataNodeIn DataInA, DataNodeIn DataInB, DataNodeOut DataOut, string name = "Random")
        {
            CheckCanAppend();
            FlowTronic NextTronic = tronics.Rand(name);

            WireArithmeticNode(NextTronic, DataInA, DataInB, DataOut);

            return this;
        }
        public TronicSequence Multiply(DataNodeIn DataInA, DataNodeIn DataInB, DataNodeOut DataOut, string name = "Multiplyer")
        {
            CheckCanAppend();
            FlowTronic NextTronic = tronics.Multiply(name);

            WireArithmeticNode(NextTronic, DataInA, DataInB, DataOut);

            return this;
        }
        public TronicSequence And(DataNodeIn Left, DataNodeIn Right, DataNodeOut DataOut, string name = "And")
        {
            CheckCanAppend();
            FlowTronic NextTronic = tronics.And(name);

            WireArithmeticNode(NextTronic, Left, Right, DataOut);

            return this;
        }
 public DataBlock(int id, string name="Data", string data="", string type="cdata")
     : base(id, type, name, data)
 {
     _in = new DataNodeIn(this);
     _out = new DataNodeOut(this);
 }
 /// <summary>
 /// Wires this tronic's DataOutA node to a data block
 /// </summary>
 /// <param name="other">The DataNode to wire to, in Out format</param>
 public virtual void DataOutB(DataNodeOut other)
 {
     this.WireTo(this.GetNode(NodeType.DataOutB), other.Parent.GetNode(NodeType.DataBlock));
 }
 /// <summary>
 /// Wires this tronic's DataOutA node to a data block
 /// </summary>
 /// <param name="other">The DataNode to wire to, in Out format</param>
 public virtual void DataOutA(DataNodeOut other)
 {
     if (other == null)
         return;
     this.WireTo(this.GetNode(NodeType.DataOutA), other.Parent.GetNode(NodeType.DataBlock));
 }