Creating an input range over a tree structure
Using ranges in cases where you would typically use a recursive function can be a bit tricky. As the function flow when using ranges is controlled externally, you can't use recursion. Instead, you must maintain a stack of state inside your range structure. Here, we'll implement an input range that iterates over a tree structure of arbitrary depth.
Getting ready
First, let's look at the most straightforward way to implement this loop, which is with a recursive function. This is shown in the following code:
struct TreePart { string payload; TreePart[] children; } void walkTree(void delegate(string) visitor, TreePart root) { visitor(root.payload); foreach(child; root.children) walkTree(visitor, child); }
This function lends itself easily to the opApply
iteration, which is great for foreach
loops, but internal iteration doesn't interact well with the other algorithms and ranges in Phobos and other libraries. How can we make a...