It simply calls the function f on each item when a successful poll happens and immediately returns the result. There is no internal buffering to "reach back" into the stream, and there in fact cannot be with any of those wrapper futures/streams because the underlying stream only polls successfully after the values have been taken out of whatever buffer the stream uses.
In other words, the Stream trait is only concerned with "taking", and everything in StreamExt is implemented strictly in terms of that. The only reason there would be internal buffering is if a stream wrapper was trying to store some values to deliberately delay them until later.