Add netstandard2.1 target, and refactor the async linq to use the platform's IAsyncEnumerable<T> / IAsyncEnumerator<T> interfaces.
Notable changes:
Custom versions of IAsyncEnumerable<T>, IAsyncEnumerator<T> and IAsyncDisposable removed in .NET Standard 2.1 build, but still present in NetFX and .NET Standard 2.0.
They have been moved from Doxense.Linq to System.Collection.Generics namespace
Code now requires C# 8.0 to compile ('await using')
Possible future issues:
IAsyncEnumerable<T> has no way to pass the enumeration hint up the call chain (WantAll, Head, Iterator, ...) which may reduce the performances of some operations. Currently, the IConfigurableAsyncEnumerable<T> interface is still there to enable this, but it will only work if using our own async LINQ implementation (that implement that interface). Once we have to move other the the (expected) BCL's implementation of async linq, this will become an issue.
Possible optimizations to consider:
Could probably rewrite most of the async linq operators using async iterators and await foreach...
Add netstandard2.1 target, and refactor the async linq to use the platform's
IAsyncEnumerable<T>
/IAsyncEnumerator<T>
interfaces.Notable changes:
IAsyncEnumerable<T>
,IAsyncEnumerator<T>
andIAsyncDisposable
removed in .NET Standard 2.1 build, but still present in NetFX and .NET Standard 2.0.Doxense.Linq
toSystem.Collection.Generics
namespacePossible future issues:
IAsyncEnumerable<T>
has no way to pass the enumeration hint up the call chain (WantAll, Head, Iterator, ...) which may reduce the performances of some operations. Currently, theIConfigurableAsyncEnumerable<T>
interface is still there to enable this, but it will only work if using our own async LINQ implementation (that implement that interface). Once we have to move other the the (expected) BCL's implementation of async linq, this will become an issue.Possible optimizations to consider: