public ICleanerNode Sub(ICleanerNode a) { if (typeof(ComplexCleanerNode) == a.GetType()) { ((ComplexCleanerNode)a).IterateOverComputables((IComputableCleanerNode node, int i) => { Sub(node); }); return(this); } else if (typeof(CleanerNode) == a.GetType()) { for (int i = 0; i < subNodes.Count; i++) { if (!typeof(IComputableCleanerNode).IsAssignableFrom(subNodes[i].GetType())) { continue; } IComputableCleanerNode node = (IComputableCleanerNode)subNodes[i]; if (CleanerNode.CanAdd((CleanerNode)node, (CleanerNode)a)) { subNodes[i] = (CleanerNode)node - (CleanerNode)a; } } return(this); } throw new System.NotImplementedException(); }
public ICleanerNode Add(ICleanerNode a) { if (typeof(ComplexCleanerNode) == a.GetType()) { ComplexCleanerNode ccna = ((ComplexCleanerNode)a); for (int j = 0; j < ccna.subNodes.Count; j++) { if (!typeof(IComputableCleanerNode).IsAssignableFrom(ccna.subNodes[j].GetType())) { continue; } Add(ccna.subNodes[j]); } return(this); } else if (typeof(CleanerNode) == a.GetType()) { bool added = false; for (int i = 0; i < subNodes.Count; i++) { if (!typeof(IComputableCleanerNode).IsAssignableFrom(subNodes[i].GetType())) { continue; } IComputableCleanerNode node = (IComputableCleanerNode)subNodes[i]; if (CleanerNode.CanAdd((CleanerNode)node, (CleanerNode)a)) { added = true; subNodes[i] = (CleanerNode)node + (CleanerNode)a; break; } } if (!added) { subNodes.Add(new CleanerOperatorNode('+')); subNodes.Add(a); } return(this); } throw new System.NotImplementedException(); }