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); }