/// <summary> /// Default <see cref="NodeListProcessor"/> implementation used by <see cref="Childrens"/> iterator. /// </summary> /// <param name="list">The list.</param> /// <param name="nodeProcessorContext">The node processor context.</param> public static void DefaultListProcessor(IList list, ref NodeProcessorContext nodeProcessorContext) { if (list != null) { var nodeProcessor = nodeProcessorContext.NodeProcessor; int i = 0; while (i < list.Count) { var previousValue = (Node)list[i]; var temp = nodeProcessor(previousValue, ref nodeProcessorContext); // Recover the position as the list can be modified while processing a node for (i = 0; i < list.Count; i++) { if (ReferenceEquals(previousValue, list[i])) { break; } } if (temp == null) { list.RemoveAt(i); } else { if (!ReferenceEquals(previousValue, temp)) { list[i] = temp; } i++; } } } }
/// <summary> /// Iterate on childrens and apply the specified transform function. /// </summary> /// <param name="node">The node.</param> /// <param name="nodeProcessor">The process.</param> /// <param name="listProcessor">The list processor. Default is null using default implementation.</param> /// <returns>The source node</returns> public static Node Childrens(this Node node, NodeProcessor nodeProcessor, NodeListProcessor listProcessor = null) { if (node == null) { return(null); } var type = node.GetType(); var process = RegisteredProcessors.GetOrAdd(type, BuildChildrensIterator); if (listProcessor == null) { listProcessor = DefaultListProcessor; } var context = new NodeProcessorContext(nodeProcessor, listProcessor); return(process(node, ref context)); }
private Node OnProcessor(Node nodeArg, ref NodeProcessorContext explorer) { return VisitDynamic(nodeArg); }