Unfolders provide a way to unfold data structures.
They are basically Alternative instances, but the choose method
allows the unfolder to do something special for the recursive positions
of the data structure.

Unfolder

Unfolders provide a way to unfold data structures.
The methods have default implementations in terms of Alternative,
but you can implement choose to act on recursive positions of the
data structure, or simply to provide a faster implementation than asum.

Apply a certain function of type f a -> f a to the result of a choose.
The depth is passed as Int, so you can apply a different function at each depth.
Because of a forall, the function needs to be wrapped in a NT constructor.
See limitDepth for an example how to use this function.