Doing something a little bit complicated here: the functional equivalent of a visitor pattern, where I want to apply a few functions to a long and potentially expensive to traverse sequence of items (so ruling out a series of iterations over the visited nodes) --
BuildNodeSequence itself returns a nested sequence expression of the data to visit, and state is well, expected to be handled by mutable out-of-band means.
This works nicely, but is impure -- so let's try to fix that by having the visitor function update itself with the transient state we need to carry between (there will still be side-effects for output). The code becomes
Fix delegate type is a way of reifying an otherwise infinite type
Node ->'a where
'a is also
Node ->'a through
and have it build
Well, I run this and...
Nothing happens -- or at least
apply gets called for every node to visit, but
invoke never did; until I forced the evaluation of the visitors sequence by
So, what I finally ended up with is
where the inner iterable is evaluated eagerly, rather than being left to lazy
IEnumerable expansion; and this then works.