Problem
Many libraries (such as database drivers) nowadays return AsyncIterator instances. I have found it to be a great abstraction for an asyncronous sequence of items, mainly because it's well integrated with the language, thanks to the for await, yield, and yield* statements.
But writing the same imperative loops over and over again has the same drawbacks we know from working with regular iterators and collections. Therefore I have been factoring my code into my own hodge-podge of functional utilities (map, filter, take...) implemented using async generators and for async loops.
It would be nice if ferrum was somehow extended to work with them, using the same universal language it has already defined for working with synchronous collections and iterators.
Proposed solution
It is well known that Symbol.iterator (ie. Ferrum's Sequence trait) cannot be implemented for AsyncIterator / AsyncGenerator objects. Therefore one solution would be to implement a new AsyncSequence trait, reusing the standard Symbol.asyncIterator symbol, and extending the entire Ferrum library to work with it.
For instance, map() would check whether its first argument implements the AsyncSequence trait and in that case return an AsyncSequence itself.