This is really a completely different protocol. I have called it the "multitruth" protocol, but a better name is needed.
What about `maybe->list*' instead?
It's really "list-or-false" protocol, but that is just too long.
The `assume' is only for clarity; you can remove it without changing
the semantics. The point is that `stop?' has to be called n + 1 times
according to the `unfold' protocol when you generate something of
That makes sense only if `successor` is being called for its side effects only.
Indeed. The same goes for `stop?'. If you want to implement the `unfold' protocol, you have to include this as well. Otherwise, we better drop the unfold altogether.
We do make the initial call on stop?, which is the first thing the unfold protocol does, so stop? must be present; it determines whether we get a Just/Right if stop? returns #t or a Nothing/Left if stop? returns #f.
Successor is used to go from the current seeds to the seeds for the next iteration, but as there never can be another iteration, there is no need to call it.