[API Proposal]: ToObservable and ToAsyncEnumerable()

Open
#119,040 10 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
35/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Quiet
Tech stack
csharp

Research direction

Start with the proposed System.Linq.AsyncEnumerable API and the linked dotnet/reactive issues 2212 and 2199, then trace the existing IObservable and IAsyncEnumerable conversion behavior. The payload names no repository files or tests; done requires an agreed implementation of both proposed helpers that addresses the cited implementation concerns.

Written by the indexing model from the issue text.

Description

api-suggestion area-System.Linq help wanted
Background and motivation

Both IObservable<T> and IAsyncEnumerable<T> are defined in the runtime,
however the conversion helpers between one and the other are not.

Since System.Linq.Async will be deprecated, these methods need to be defined somehwere else.
In my opinion makes sense to define them here, in a similar way of this DataFlowBlock to IObservable<T> helper.

Note also that current implementations in dotnet/reactive have some serious issues. So it doesn't exist any valid implementation at all at the moment! (See for example this issue on reactive).

See also this.

API Proposal
using System.Collections.Generic;

namespace System.Linq;
public static partial class AsyncEnumerable
{
    public static IAsyncEnumerable<TSource> ToAsyncEnumerable<TSource>(this IObservable<TSource> source);
    public static IObservable<TSource> ToObservable<TSource>(this IAsyncEnumerable<TSource> source);
}

API Usage
using System.Reactive.Linq;
using System.Threading.Channels;

var source = Observable.Timer(TimeSpan.FromSeconds(1));
await foreach (var tick in source.ToAsyncEnumerable())
{
    if (tick == 4) break;
    Console.WriteLine(tick);
}

var numbersChannel = Channel.CreateUnbounded<int>();
IObservable<int> numbersObservable = numbersChannel.Reader
                                                   .ReadAllAsync()
                                                   .ToObservable();
Alternative Designs

No response

Risks

No response

Dominant language
C#
Stars
18.3k
Forks
5.6k
PR merge metrics
PR metrics pending

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from dotnet/runtime

All issues in dotnet/runtime

Similar issues

More C# issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.