This. Users are supposed to assume that Sequence is single-pass, but it actively tries to confuse them with methods like makeIterator() that can't mutate the Sequence, on top of the fact that IteratorProtocol also exists and is an excellent model of a single-pass Sequence. I wrote about this a while ago, but it bears repeating here:
You get one shot - one chance to inspect the elements in the sequence, and after that, anything you do is semantically undefined. We don't provide any guidance on what a Sequence should do if somebody tries to iterate it again after consuming it (return an empty iterator? trap? produce random values?).
func myAlgorithm<S>(_ input: S) where S: Sequence, S.Element == Int {
if input.contains(42) {
// We have consumed 'input'. Who knows what accessing it again will do?
}
// We have consumed 'input'. Who knows what accessing it again will do?
}
None of the Sequence API makes this behaviour clear. Actually, it actively tries to confuse you by having the same operations with the same names as you'd find on a Collection, but with totally different composition semantics. I would bet that at least 3/4 of generic algorithms which accept a Sequence are incorrect - and again, we don't provide any guidance about what might happen in those cases. They likely won't be "unsafe" in the sense of memory safety, but they will produce unpredictable results and possibly lose or corrupt user data.
All of these flaws are inherited by this proposed AsyncSequence design. In fact it actually adds one:
Sequence explicitly does not include a count property, because like all Sequence APIs which inspect the contents, it would consume it. It would tell you how many elements it used to contain, but that's kind of irrelevant because you'll never see that sequence of elements again.
That's not to say that Sequence is entirely useless, though! It's there because if you have an algorithm which really is single-pass, it would be nice for Collections to have access to it without the ugliness of creating an iterator. The downside is that the same method handles both consuming and non-consuming cases, with the same spelling.
Since we don't have an async Collection, it's hard to justify an async Sequence.
EDIT: Updated reason why we have Sequence (I had to look it up!)