Given the flow of the code though, this should be relatively easily optimized away, no? Since, it's basically actually "if (empty) return" followed by "if (empty) break"... That, and it's about the same as almost every adaptor (take, filter, splitter, joiner... )

I (personally) find that straight up update tends to be easier than lazy update. Plus, it helps have a more deterministic behavior, which is always good.