Exemple #1
0
        private static void AddInnerNodesToQueue <TItem, TState>(IList <GraphNode <TItem> > innerNodes, Queue <NodeWithState <TItem, TState> > queue, TState innerState)
        {
            var count = innerNodes.Count;

            for (var i = 0; i < count; i++)
            {
                var innerNode = innerNodes[i];
                queue.Enqueue(NodeWithState.Create(innerNode, innerState));
            }
        }
        private static void ForEach <TItem, TState, TContext>(this GraphNode <TItem> root, TState state, Func <GraphNode <TItem>, TState, TContext, TState> visitor, TContext context)
        {
            var queue = Cache <TItem, TState> .RentQueue();

            // breadth-first walk of Node tree
            queue.Enqueue(NodeWithState.Create(root, state));
            while (queue.Count > 0)
            {
                var work = queue.Dequeue();
                state = visitor(work.Node, work.State, context);

                AddInnerNodesToQueue(work.Node.InnerNodes, queue, state);
            }

            Cache <TItem, TState> .ReleaseQueue(queue);
        }