예제 #1
0
        /// <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++;
                    }
                }
            }
        }
예제 #2
0
        /// <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));
        }
예제 #3
0
 private Node OnProcessor(Node nodeArg, ref NodeProcessorContext explorer)
 {
     return VisitDynamic(nodeArg);
 }