Andrzej Krzemienski wrote:
So it looks to me that Capy has at least two distinct parts with distinct purposes.
One is the proposed universal API for associating awaitables with their execution environment, and for propagating this environment through coroutines. One that hopefully every library dealing with awaitiables would want to adapt.
It comprises: * concepts IoAwaitable, IoRunnable, Executor, ExecutionContext * type-erased executor * synchronization primitives, strands * functions such as when_any, when_all * task<>
The other is "stream interfaces". Not stream implementations: just interfaces. It uses the former part. It comprises: * buffers * stream concepts * type erasure for streams * stream-related algorithms, such as read_until.
It's more than two parts. The second part is actually 1. Buffer sequences * ConstBufferSequence, MutableBufferSequence concepts * supporting primitives: buffer_begin, buffer_end, buffer_size, buffer_length, buffer_slice 2. Streams, stream-related algorithms * read, write 3. Type erasure 4. DynamicBuffer Here (1) has nothing to do with coroutines and is completely independent.