diff --git a/R3.sln b/R3.sln index 1eb03e5d..c78c5a9c 100644 --- a/R3.sln +++ b/R3.sln @@ -48,6 +48,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiApp1", "sandbox\MauiApp EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "R3.Maui", "src\R3.Maui\R3.Maui.csproj", "{F1D6609C-AA33-4099-8932-BADBCB935FBD}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoGameApplication1", "sandbox\MonoGameApplication1\MonoGameApplication1.csproj", "{BEF76A77-E2F9-4113-8DC2-DB825964D6EF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "R3.MonoGame", "src\R3.MonoGame\R3.MonoGame.csproj", "{D754069D-C912-4D71-97CB-9B2DDD2380B4}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "R3.WinUI3", "src\R3.WinUI3\R3.WinUI3.csproj", "{87F12DBB-E32B-49B8-B5F1-5B53B711989B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinUI3App1", "sandbox\WinUI3App1\WinUI3App1.csproj", "{CDC17599-81AD-44B9-B4E5-38241147CDA2}" @@ -319,6 +322,14 @@ Global {F1D6609C-AA33-4099-8932-BADBCB935FBD}.Debug|x86.Build.0 = Debug|Any CPU {F1D6609C-AA33-4099-8932-BADBCB935FBD}.Release|Any CPU.ActiveCfg = Release|Any CPU {F1D6609C-AA33-4099-8932-BADBCB935FBD}.Release|Any CPU.Build.0 = Release|Any CPU + {BEF76A77-E2F9-4113-8DC2-DB825964D6EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BEF76A77-E2F9-4113-8DC2-DB825964D6EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEF76A77-E2F9-4113-8DC2-DB825964D6EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BEF76A77-E2F9-4113-8DC2-DB825964D6EF}.Release|Any CPU.Build.0 = Release|Any CPU + {D754069D-C912-4D71-97CB-9B2DDD2380B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D754069D-C912-4D71-97CB-9B2DDD2380B4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D754069D-C912-4D71-97CB-9B2DDD2380B4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D754069D-C912-4D71-97CB-9B2DDD2380B4}.Release|Any CPU.Build.0 = Release|Any CPU {F1D6609C-AA33-4099-8932-BADBCB935FBD}.Release|ARM64.ActiveCfg = Release|Any CPU {F1D6609C-AA33-4099-8932-BADBCB935FBD}.Release|ARM64.Build.0 = Release|Any CPU {F1D6609C-AA33-4099-8932-BADBCB935FBD}.Release|x64.ActiveCfg = Release|Any CPU @@ -386,6 +397,8 @@ Global {B95D732A-7538-4795-AC42-6F595ECB8DB8} = {9FA6D327-728B-4436-AE3A-9E46D8FEF591} {2CD257D7-DF21-4D60-AC05-747D83236E5A} = {FAB2137C-1DBA-4F2F-8E22-DF3521C9B365} {F1D6609C-AA33-4099-8932-BADBCB935FBD} = {9FA6D327-728B-4436-AE3A-9E46D8FEF591} + {BEF76A77-E2F9-4113-8DC2-DB825964D6EF} = {FAB2137C-1DBA-4F2F-8E22-DF3521C9B365} + {D754069D-C912-4D71-97CB-9B2DDD2380B4} = {9FA6D327-728B-4436-AE3A-9E46D8FEF591} {87F12DBB-E32B-49B8-B5F1-5B53B711989B} = {9FA6D327-728B-4436-AE3A-9E46D8FEF591} {CDC17599-81AD-44B9-B4E5-38241147CDA2} = {FAB2137C-1DBA-4F2F-8E22-DF3521C9B365} EndGlobalSection diff --git a/README.md b/README.md index bd238edf..f5e7f225 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # R3 -The new future of [dotnet/reactive](https://github.com/dotnet/reactive/) and [UniRx](https://github.com/neuecc/UniRx), which support many platforms including [Unity](#unity), [Godot](#godot), [Avalonia](#avalonia), [WPF](#wpf), [WinForms](#winforms), [Stride](#stride), [LogicLooper](#logiclooper), etc(planning MAUI, WINUI3, MonoGame). +The new future of [dotnet/reactive](https://github.com/dotnet/reactive/) and [UniRx](https://github.com/neuecc/UniRx), which support many platforms including [Unity](#unity), [Godot](#godot), [Avalonia](#avalonia), [WPF](#wpf), [WinForms](#winforms), [Stride](#stride), [LogicLooper](#logiclooper), [MAUI](#maui), [MonoGame](#monogame), etc(planning WINUI3). > [!NOTE] > This project is currently in preview. We are seeking a lot of feedback, if you have any opinions, request missing feature, please post them in the [Issues](https://github.com/Cysharp/R3/issues). @@ -439,13 +439,13 @@ Interoperability with `async/await` --- R3 has special integration with `async/await`. -| Name | ReturnType | -| --- | --- | -| **SelectAwait**(this `Observable` source, `Func>` selector, `AwaitOperations` awaitOperations = Queue, `Boolean` configureAwait = True) | `Observable` | -| **WhereAwait**(this `Observable` source, `Func>` predicate, `AwaitOperations` awaitOperations = Queue, `Boolean` configureAwait = True) | `Observable` | -| **SubscribeAwait**(this `Observable` source, `Func` onNextAsync, `AwaitOperations` awaitOperations = Queue, `Boolean` configureAwait = True) | `IDisposable` | -| **SubscribeAwait**(this `Observable` source, `Func` onNextAsync, `Action` onCompleted, `AwaitOperations` awaitOperations = Queue, `Boolean` configureAwait = True) | `IDisposable` | -| **SubscribeAwait**(this `Observable` source, `Func` onNextAsync, `Action` onErrorResume, `Action` onCompleted, `AwaitOperations` awaitOperations = Queue, `Boolean` configureAwait = True) | `IDisposable` | +| Name | ReturnType | +| --- | --- | +| **SelectAwait**(this `Observable` source, `Func>` selector, `AwaitOperations` awaitOperations = Queue, `Boolean` configureAwait = True) | `Observable` | +| **WhereAwait**(this `Observable` source, `Func>` predicate, `AwaitOperations` awaitOperations = Queue, `Boolean` configureAwait = True) | `Observable` | +| **SubscribeAwait**(this `Observable` source, `Func` onNextAsync, `AwaitOperations` awaitOperations = Queue, `Boolean` configureAwait = True) | `IDisposable` | +| **SubscribeAwait**(this `Observable` source, `Func` onNextAsync, `Action` onCompleted, `AwaitOperations` awaitOperations = Queue, `Boolean` configureAwait = True) | `IDisposable` | +| **SubscribeAwait**(this `Observable` source, `Func` onNextAsync, `Action` onErrorResume, `Action` onCompleted, `AwaitOperations` awaitOperations = Queue, `Boolean` configureAwait = True) | `IDisposable` | ```csharp public enum AwaitOperation @@ -524,10 +524,10 @@ public class BasicUsagesViewModel : IDisposable - + @@ -1185,7 +1185,7 @@ You can watch subscription status in `Debugger -> ObservableTracker` view. ### Stride -R3 extensions for [Stride](https://stride3d.net) game engine. +R3 extensions for [Stride](https://stride3d.net) game engine. > PM> Install-Package [R3Extensions.Stride](https://www.nuget.org/packages/R3Extensions.Stride) @@ -1231,9 +1231,56 @@ public static Observable AsObservable(this EventKey eventKey, Cancellat public static Observable AsObservable(this EventKey eventKey, CancellationToken token = default) ``` +### MonoGame + +R3 extensions for [MonoGame](https://monogame.net) game engine. + +> PM> Install-Package [R3Extensions.MonoGame](https://www.nuget.org/packages/R3Extensions.MonoGame) + +Set up as follows: + +1. Reference R3.MonoGame +2. Add an instance of `ObservableSystemComponent` to your Game class. + +```csharp +public class Game1 : Game +{ + public Game1() + { + var observableSystemComponent = new ObservableSystemComponent(this); + Components.Add(observableSystemComponent); + } +} +``` + +ObservableSystemComponent configure the following: +- Setup TimeProvider and FrameProvider. + - Time based operations are replaced with `Game.Update(GameTime)`. + - Frame based operations are replaced with `Game.Update(GameTime)`. +- Set UnhandledExceptionHandler. By default, the unhandled exception handler simply flows to System.Diagnostics.Trace. + - If you want to change this, do the following: + - ```csharp + new ObservableSystemComponent(this, ex => Console.WriteLine($"R3 UnhandledException: {ex}"); + ``` + +R3Extensions.MonoGame provides these providers. + +* MonoGameTimeProvider +* MonoGameFrameProvider + +And provides these custom operators. + +```csharp +// Observe the current GameTime value. +public static Observable GameTime(this Observable source) + +// observe the current GameTime and the value of the source observable. +public static Observable<(GameTime GameTime, T Item)> GameTime(this Observable source) +``` + ### LogicLooper -R3 extensions for [LogicLooper](https://github.com/Cysharp/LogicLooper/) +R3 extensions for [LogicLooper](https://github.com/Cysharp/LogicLooper/) > PM> Install-Package [R3Extensions.LogicLooper](https://www.nuget.org/packages/R3Extensions.LogicLooper) @@ -1254,99 +1301,99 @@ For default time based operations that do not take a provider, `ObservableSystem Factory methods are defined as static methods in the static class `Observable`. -| Name(Parameter) | ReturnType | -| --- | --- | -| **Amb**(params `Observable[]` sources) | `Observable` | -| **Amb**(`IEnumerable>` sources) | `Observable` | -| **CombineLatest**(params `Observable[]` sources) | `Observable` | -| **CombineLatest**(`IEnumerable>` sources) | `Observable` | -| **Concat**(params `Observable[]` sources) | `Observable` | -| **Concat**(`IEnumerable>` sources) | `Observable` | -| **Concat**(this `Observable>` sources) | `Observable` | -| **Create**(`Func, IDisposable>` subscribe, `Boolean` rawObserver = False) | `Observable` | -| **Create**(`TState` state, `Func, TState, IDisposable>` subscribe, `Boolean` rawObserver = False) | `Observable` | -| **Create**(`Func, CancellationToken, ValueTask>` subscribe, `Boolean` rawObserver = False) | `Observable` | -| **Create**(`TState` state, `Func, TState, CancellationToken, ValueTask>` subscribe, `Boolean` rawObserver = False) | `Observable` | -| **CreateFrom**(`Func>` factory) | `Observable` | -| **CreateFrom**(`TState` state, `Func>` factory) | `Observable` | -| **Defer**(`Func>` observableFactory) | `Observable` | -| **Empty**() | `Observable` | -| **Empty**(`TimeProvider` timeProvider) | `Observable` | -| **Empty**(`TimeSpan` dueTime, `TimeProvider` timeProvider) | `Observable` | -| **EveryUpdate**() | `Observable` | -| **EveryUpdate**(`CancellationToken` cancellationToken) | `Observable` | -| **EveryUpdate**(`FrameProvider` frameProvider) | `Observable` | -| **EveryUpdate**(`FrameProvider` frameProvider, `CancellationToken` cancellationToken) | `Observable` | -| **EveryValueChanged**(`TSource` source, `Func` propertySelector, `CancellationToken` cancellationToken = default) | `Observable` | -| **EveryValueChanged**(`TSource` source, `Func` propertySelector, `FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **EveryValueChanged**(`TSource` source, `Func` propertySelector, `EqualityComparer` equalityComparer, `CancellationToken` cancellationToken = default) | `Observable` | -| **EveryValueChanged**(`TSource` source, `Func` propertySelector, `FrameProvider` frameProvider, `EqualityComparer` equalityComparer, `CancellationToken` cancellationToken = default) | `Observable` | -| **FromAsync**(`Func` asyncFactory, `Boolean` configureAwait = True) | `Observable` | -| **FromAsync**(`Func>` asyncFactory, `Boolean` configureAwait = True) | `Observable` | -| **FromEvent**(`Action` addHandler, `Action` removeHandler, `CancellationToken` cancellationToken = default) | `Observable` | -| **FromEvent**(`Action>` addHandler, `Action>` removeHandler, `CancellationToken` cancellationToken = default) | `Observable` | -| **FromEvent**(`Func` conversion, `Action` addHandler, `Action` removeHandler, `CancellationToken` cancellationToken = default) | `Observable` | -| **FromEvent**(`Func, TDelegate>` conversion, `Action` addHandler, `Action` removeHandler, `CancellationToken` cancellationToken = default) | `Observable` | -| **FromEventHandler**(`Action` addHandler, `Action` removeHandler, `CancellationToken` cancellationToken = default) | `Observable>` | -| **FromEventHandler**(`Action>` addHandler, `Action>` removeHandler, `CancellationToken` cancellationToken = default) | `Observable>` | -| **Interval**(`TimeSpan` period, `CancellationToken` cancellationToken = default) | `Observable` | -| **Interval**(`TimeSpan` period, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **IntervalFrame**(`Int32` periodFrame, `CancellationToken` cancellationToken = default) | `Observable` | -| **IntervalFrame**(`Int32` periodFrame, `FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **Merge**(params `Observable[]` sources) | `Observable` | -| **Merge**(`IEnumerable>` sources) | `Observable` | -| **Merge**(this `Observable>` sources) | `Observable` | -| **Never**() | `Observable` | -| **NextFrame**(`CancellationToken` cancellationToken = default) | `Observable` | -| **NextFrame**(`FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **Range**(`Int32` start, `Int32` count) | `Observable` | -| **Range**(`Int32` start, `Int32` count, `CancellationToken` cancellationToken) | `Observable` | -| **Repeat**(`T` value, `Int32` count) | `Observable` | -| **Repeat**(`T` value, `Int32` count, `CancellationToken` cancellationToken) | `Observable` | -| **Return**(`T` value) | `Observable` | -| **Return**(`T` value, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **Return**(`T` value, `TimeSpan` dueTime, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **Return**(`Unit` value) | `Observable` | -| **Return**(`Boolean` value) | `Observable` | -| **Return**(`Int32` value) | `Observable` | -| **ReturnFrame**(`T` value, `CancellationToken` cancellationToken = default) | `Observable` | -| **ReturnFrame**(`T` value, `FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **ReturnFrame**(`T` value, `Int32` dueTimeFrame, `CancellationToken` cancellationToken = default) | `Observable` | -| **ReturnFrame**(`T` value, `Int32` dueTimeFrame, `FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **ReturnOnCompleted**(`Result` result) | `Observable` | -| **ReturnOnCompleted**(`Result` result, `TimeProvider` timeProvider) | `Observable` | -| **ReturnOnCompleted**(`Result` result, `TimeSpan` dueTime, `TimeProvider` timeProvider) | `Observable` | -| **ReturnUnit**() | `Observable` | -| **Throw**(`Exception` exception) | `Observable` | -| **Throw**(`Exception` exception, `TimeProvider` timeProvider) | `Observable` | -| **Throw**(`Exception` exception, `TimeSpan` dueTime, `TimeProvider` timeProvider) | `Observable` | -| **Timer**(`TimeSpan` dueTime, `CancellationToken` cancellationToken = default) | `Observable` | -| **Timer**(`DateTimeOffset` dueTime, `CancellationToken` cancellationToken = default) | `Observable` | -| **Timer**(`TimeSpan` dueTime, `TimeSpan` period, `CancellationToken` cancellationToken = default) | `Observable` | -| **Timer**(`DateTimeOffset` dueTime, `TimeSpan` period, `CancellationToken` cancellationToken = default) | `Observable` | -| **Timer**(`TimeSpan` dueTime, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **Timer**(`DateTimeOffset` dueTime, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **Timer**(`TimeSpan` dueTime, `TimeSpan` period, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **Timer**(`DateTimeOffset` dueTime, `TimeSpan` period, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **TimerFrame**(`Int32` dueTimeFrame, `CancellationToken` cancellationToken = default) | `Observable` | -| **TimerFrame**(`Int32` dueTimeFrame, `Int32` periodFrame, `CancellationToken` cancellationToken = default) | `Observable` | -| **TimerFrame**(`Int32` dueTimeFrame, `FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **TimerFrame**(`Int32` dueTimeFrame, `Int32` periodFrame, `FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **ToObservable**(this `Task` task, `Boolean` configureAwait = True) | `Observable` | -| **ToObservable**(this `Task` task, `Boolean` configureAwait = True) | `Observable` | -| **ToObservable**(this `ValueTask` task, `Boolean` configureAwait = True) | `Observable` | -| **ToObservable**(this `ValueTask` task, `Boolean` configureAwait = True) | `Observable` | -| **ToObservable**(this `IEnumerable` source, `CancellationToken` cancellationToken = default) | `Observable` | -| **ToObservable**(this `IAsyncEnumerable` source) | `Observable` | -| **ToObservable**(this `IObservable` source) | `Observable` | -| **Yield**(`CancellationToken` cancellationToken = default) | `Observable` | -| **Yield**(`TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **YieldFrame**(`CancellationToken` cancellationToken = default) | `Observable` | -| **YieldFrame**(`FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | -| **Zip**(params `Observable[]` sources) | `Observable` | -| **Zip**(`IEnumerable>` sources) | `Observable` | -| **ZipLatest**(params `Observable[]` sources) | `Observable` | -| **ZipLatest**(`IEnumerable>` sources) | `Observable` | +| Name(Parameter) | ReturnType | +| --- | --- | +| **Amb**(params `Observable[]` sources) | `Observable` | +| **Amb**(`IEnumerable>` sources) | `Observable` | +| **CombineLatest**(params `Observable[]` sources) | `Observable` | +| **CombineLatest**(`IEnumerable>` sources) | `Observable` | +| **Concat**(params `Observable[]` sources) | `Observable` | +| **Concat**(`IEnumerable>` sources) | `Observable` | +| **Concat**(this `Observable>` sources) | `Observable` | +| **Create**(`Func, IDisposable>` subscribe, `Boolean` rawObserver = False) | `Observable` | +| **Create**(`TState` state, `Func, TState, IDisposable>` subscribe, `Boolean` rawObserver = False) | `Observable` | +| **Create**(`Func, CancellationToken, ValueTask>` subscribe, `Boolean` rawObserver = False) | `Observable` | +| **Create**(`TState` state, `Func, TState, CancellationToken, ValueTask>` subscribe, `Boolean` rawObserver = False) | `Observable` | +| **CreateFrom**(`Func>` factory) | `Observable` | +| **CreateFrom**(`TState` state, `Func>` factory) | `Observable` | +| **Defer**(`Func>` observableFactory) | `Observable` | +| **Empty**() | `Observable` | +| **Empty**(`TimeProvider` timeProvider) | `Observable` | +| **Empty**(`TimeSpan` dueTime, `TimeProvider` timeProvider) | `Observable` | +| **EveryUpdate**() | `Observable` | +| **EveryUpdate**(`CancellationToken` cancellationToken) | `Observable` | +| **EveryUpdate**(`FrameProvider` frameProvider) | `Observable` | +| **EveryUpdate**(`FrameProvider` frameProvider, `CancellationToken` cancellationToken) | `Observable` | +| **EveryValueChanged**(`TSource` source, `Func` propertySelector, `CancellationToken` cancellationToken = default) | `Observable` | +| **EveryValueChanged**(`TSource` source, `Func` propertySelector, `FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **EveryValueChanged**(`TSource` source, `Func` propertySelector, `EqualityComparer` equalityComparer, `CancellationToken` cancellationToken = default) | `Observable` | +| **EveryValueChanged**(`TSource` source, `Func` propertySelector, `FrameProvider` frameProvider, `EqualityComparer` equalityComparer, `CancellationToken` cancellationToken = default) | `Observable` | +| **FromAsync**(`Func` asyncFactory, `Boolean` configureAwait = True) | `Observable` | +| **FromAsync**(`Func>` asyncFactory, `Boolean` configureAwait = True) | `Observable` | +| **FromEvent**(`Action` addHandler, `Action` removeHandler, `CancellationToken` cancellationToken = default) | `Observable` | +| **FromEvent**(`Action>` addHandler, `Action>` removeHandler, `CancellationToken` cancellationToken = default) | `Observable` | +| **FromEvent**(`Func` conversion, `Action` addHandler, `Action` removeHandler, `CancellationToken` cancellationToken = default) | `Observable` | +| **FromEvent**(`Func, TDelegate>` conversion, `Action` addHandler, `Action` removeHandler, `CancellationToken` cancellationToken = default) | `Observable` | +| **FromEventHandler**(`Action` addHandler, `Action` removeHandler, `CancellationToken` cancellationToken = default) | `Observable>` | +| **FromEventHandler**(`Action>` addHandler, `Action>` removeHandler, `CancellationToken` cancellationToken = default) | `Observable>` | +| **Interval**(`TimeSpan` period, `CancellationToken` cancellationToken = default) | `Observable` | +| **Interval**(`TimeSpan` period, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **IntervalFrame**(`Int32` periodFrame, `CancellationToken` cancellationToken = default) | `Observable` | +| **IntervalFrame**(`Int32` periodFrame, `FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **Merge**(params `Observable[]` sources) | `Observable` | +| **Merge**(`IEnumerable>` sources) | `Observable` | +| **Merge**(this `Observable>` sources) | `Observable` | +| **Never**() | `Observable` | +| **NextFrame**(`CancellationToken` cancellationToken = default) | `Observable` | +| **NextFrame**(`FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **Range**(`Int32` start, `Int32` count) | `Observable` | +| **Range**(`Int32` start, `Int32` count, `CancellationToken` cancellationToken) | `Observable` | +| **Repeat**(`T` value, `Int32` count) | `Observable` | +| **Repeat**(`T` value, `Int32` count, `CancellationToken` cancellationToken) | `Observable` | +| **Return**(`T` value) | `Observable` | +| **Return**(`T` value, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **Return**(`T` value, `TimeSpan` dueTime, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **Return**(`Unit` value) | `Observable` | +| **Return**(`Boolean` value) | `Observable` | +| **Return**(`Int32` value) | `Observable` | +| **ReturnFrame**(`T` value, `CancellationToken` cancellationToken = default) | `Observable` | +| **ReturnFrame**(`T` value, `FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **ReturnFrame**(`T` value, `Int32` dueTimeFrame, `CancellationToken` cancellationToken = default) | `Observable` | +| **ReturnFrame**(`T` value, `Int32` dueTimeFrame, `FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **ReturnOnCompleted**(`Result` result) | `Observable` | +| **ReturnOnCompleted**(`Result` result, `TimeProvider` timeProvider) | `Observable` | +| **ReturnOnCompleted**(`Result` result, `TimeSpan` dueTime, `TimeProvider` timeProvider) | `Observable` | +| **ReturnUnit**() | `Observable` | +| **Throw**(`Exception` exception) | `Observable` | +| **Throw**(`Exception` exception, `TimeProvider` timeProvider) | `Observable` | +| **Throw**(`Exception` exception, `TimeSpan` dueTime, `TimeProvider` timeProvider) | `Observable` | +| **Timer**(`TimeSpan` dueTime, `CancellationToken` cancellationToken = default) | `Observable` | +| **Timer**(`DateTimeOffset` dueTime, `CancellationToken` cancellationToken = default) | `Observable` | +| **Timer**(`TimeSpan` dueTime, `TimeSpan` period, `CancellationToken` cancellationToken = default) | `Observable` | +| **Timer**(`DateTimeOffset` dueTime, `TimeSpan` period, `CancellationToken` cancellationToken = default) | `Observable` | +| **Timer**(`TimeSpan` dueTime, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **Timer**(`DateTimeOffset` dueTime, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **Timer**(`TimeSpan` dueTime, `TimeSpan` period, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **Timer**(`DateTimeOffset` dueTime, `TimeSpan` period, `TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **TimerFrame**(`Int32` dueTimeFrame, `CancellationToken` cancellationToken = default) | `Observable` | +| **TimerFrame**(`Int32` dueTimeFrame, `Int32` periodFrame, `CancellationToken` cancellationToken = default) | `Observable` | +| **TimerFrame**(`Int32` dueTimeFrame, `FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **TimerFrame**(`Int32` dueTimeFrame, `Int32` periodFrame, `FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **ToObservable**(this `Task` task, `Boolean` configureAwait = True) | `Observable` | +| **ToObservable**(this `Task` task, `Boolean` configureAwait = True) | `Observable` | +| **ToObservable**(this `ValueTask` task, `Boolean` configureAwait = True) | `Observable` | +| **ToObservable**(this `ValueTask` task, `Boolean` configureAwait = True) | `Observable` | +| **ToObservable**(this `IEnumerable` source, `CancellationToken` cancellationToken = default) | `Observable` | +| **ToObservable**(this `IAsyncEnumerable` source) | `Observable` | +| **ToObservable**(this `IObservable` source) | `Observable` | +| **Yield**(`CancellationToken` cancellationToken = default) | `Observable` | +| **Yield**(`TimeProvider` timeProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **YieldFrame**(`CancellationToken` cancellationToken = default) | `Observable` | +| **YieldFrame**(`FrameProvider` frameProvider, `CancellationToken` cancellationToken = default) | `Observable` | +| **Zip**(params `Observable[]` sources) | `Observable` | +| **Zip**(`IEnumerable>` sources) | `Observable` | +| **ZipLatest**(params `Observable[]` sources) | `Observable` | +| **ZipLatest**(`IEnumerable>` sources) | `Observable` | Methods that accept a `CancellationToken` will emit `OnCompleted` when a Cancel is issued. This allows you to unsubscribe all subscriptions from the event source. @@ -1379,291 +1426,291 @@ Among our custom frame-based methods, `EveryUpdate` emits values every frame. `Y Operator methods are defined as extension methods to `Observable` in the static class `ObservableExtensions`. -| Name(Parameter) | ReturnType | -| --- | --- | -| **AggregateAsync**(this `Observable` source, `Func` func, `CancellationToken` cancellationToken = default) | `Task` | -| **AggregateAsync**(this `Observable` source, `TResult` seed, `Func` func, `CancellationToken` cancellationToken = default) | `Task` | -| **AggregateAsync**(this `Observable` source, `TAccumulate` seed, `Func` func, `Func` resultSelector, `CancellationToken` cancellationToken = default) | `Task` | -| **AllAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | -| **Amb**(this `Observable` source, `Observable` second) | `Observable` | -| **AnyAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **AnyAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | -| **Append**(this `Observable` source, `T` value) | `Observable` | -| **AsObservable**(this `Observable` source) | `Observable` | -| **AsSystemObservable**(this `Observable` source) | `IObservable` | -| **AsUnitObservable**(this `Observable` source) | `Observable` | -| **AverageAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **AverageAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **AverageAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **AverageAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **AverageAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **AverageAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **AverageAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **AverageAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **AverageAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **AverageAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **AverageAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **AverageAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **Cast**(this `Observable` source) | `Observable` | -| **Catch**(this `Observable` source, `Observable` second) | `Observable` | -| **Catch**(this `Observable` source, `Func>` errorHandler) | `Observable` | -| **Chunk**(this `Observable` source, `Int32` count) | `Observable` | -| **Chunk**(this `Observable` source, `TimeSpan` timeSpan) | `Observable` | -| **Chunk**(this `Observable` source, `TimeSpan` timeSpan, `TimeProvider` timeProvider) | `Observable` | -| **Chunk**(this `Observable` source, `TimeSpan` timeSpan, `Int32` count) | `Observable` | -| **Chunk**(this `Observable` source, `TimeSpan` timeSpan, `Int32` count, `TimeProvider` timeProvider) | `Observable` | -| **Chunk**(this `Observable` source, `Observable` windowBoundaries) | `Observable` | -| **ChunkFrame**(this `Observable` source) | `Observable` | -| **ChunkFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | -| **ChunkFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | -| **ChunkFrame**(this `Observable` source, `Int32` frameCount, `Int32` count) | `Observable` | -| **ChunkFrame**(this `Observable` source, `Int32` frameCount, `Int32` count, `FrameProvider` frameProvider) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Func` resultSelector) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Func` resultSelector) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Func` resultSelector) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Func` resultSelector) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Func` resultSelector) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Func` resultSelector) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Func` resultSelector) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Func` resultSelector) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Func` resultSelector) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Func` resultSelector) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Func` resultSelector) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Func` resultSelector) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Observable` source14, `Func` resultSelector) | `Observable` | -| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Observable` source14, `Observable` source15, `Func` resultSelector) | `Observable` | -| **Concat**(this `Observable` source, `Observable` second) | `Observable` | -| **ContainsAsync**(this `Observable` source, `T` value, `CancellationToken` cancellationToken = default) | `Task` | -| **ContainsAsync**(this `Observable` source, `T` value, `IEqualityComparer` equalityComparer, `CancellationToken` cancellationToken = default) | `Task` | -| **CountAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **CountAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | -| **Debounce**(this `Observable` source, `TimeSpan` timeSpan) | `Observable` | -| **Debounce**(this `Observable` source, `TimeSpan` timeSpan, `TimeProvider` timeProvider) | `Observable` | -| **Debounce**(this `Observable` source, `Func` throttleDurationSelector, `Boolean` configureAwait = True) | `Observable` | -| **DebounceFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | -| **DebounceFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | -| **DefaultIfEmpty**(this `Observable` source) | `Observable` | -| **DefaultIfEmpty**(this `Observable` source, `T` defaultValue) | `Observable` | -| **Delay**(this `Observable` source, `TimeSpan` dueTime) | `Observable` | -| **Delay**(this `Observable` source, `TimeSpan` dueTime, `TimeProvider` timeProvider) | `Observable` | -| **DelayFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | -| **DelayFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | -| **DelaySubscription**(this `Observable` source, `TimeSpan` dueTime) | `Observable` | -| **DelaySubscription**(this `Observable` source, `TimeSpan` dueTime, `TimeProvider` timeProvider) | `Observable` | -| **DelaySubscriptionFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | -| **DelaySubscriptionFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | -| **Dematerialize**(this `Observable>` source) | `Observable` | -| **Distinct**(this `Observable` source) | `Observable` | -| **Distinct**(this `Observable` source, `IEqualityComparer` comparer) | `Observable` | -| **DistinctBy**(this `Observable` source, `Func` keySelector) | `Observable` | -| **DistinctBy**(this `Observable` source, `Func` keySelector, `IEqualityComparer` comparer) | `Observable` | -| **DistinctUntilChanged**(this `Observable` source) | `Observable` | -| **DistinctUntilChanged**(this `Observable` source, `IEqualityComparer` comparer) | `Observable` | -| **DistinctUntilChangedBy**(this `Observable` source, `Func` keySelector) | `Observable` | -| **DistinctUntilChangedBy**(this `Observable` source, `Func` keySelector, `IEqualityComparer` comparer) | `Observable` | -| **Do**(this `Observable` source, `Action` onNext = default, `Action` onErrorResume = default, `Action` onCompleted = default, `Action` onDispose = default, `Action` onSubscribe = default) | `Observable` | -| **Do**(this `Observable` source, `TState` state, `Action` onNext = default, `Action` onErrorResume = default, `Action` onCompleted = default, `Action` onDispose = default, `Action` onSubscribe = default) | `Observable` | -| **DoCancelOnCompleted**(this `Observable` source, `CancellationTokenSource` cancellationTokenSource) | `Observable` | -| **ElementAtAsync**(this `Observable` source, `Int32` index, `CancellationToken` cancellationToken = default) | `Task` | -| **ElementAtAsync**(this `Observable` source, `Index` index, `CancellationToken` cancellationToken = default) | `Task` | -| **ElementAtOrDefaultAsync**(this `Observable` source, `Int32` index, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | -| **ElementAtOrDefaultAsync**(this `Observable` source, `Index` index, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | -| **FirstAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **FirstAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | -| **FirstOrDefaultAsync**(this `Observable` source, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | -| **FirstOrDefaultAsync**(this `Observable` source, `Func` predicate, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | -| **ForEachAsync**(this `Observable` source, `Action` action, `CancellationToken` cancellationToken = default) | `Task` | -| **ForEachAsync**(this `Observable` source, `Action` action, `CancellationToken` cancellationToken = default) | `Task` | -| **IgnoreElements**(this `Observable` source) | `Observable` | -| **IgnoreElements**(this `Observable` source, `Action` doOnNext) | `Observable` | -| **IgnoreOnErrorResume**(this `Observable` source) | `Observable` | -| **IgnoreOnErrorResume**(this `Observable` source, `Action` doOnErrorResume) | `Observable` | -| **IsEmptyAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **LastAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **LastAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | -| **LastOrDefaultAsync**(this `Observable` source, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | -| **LastOrDefaultAsync**(this `Observable` source, `Func` predicate, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | -| **LongCountAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **LongCountAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | -| **Materialize**(this `Observable` source) | `Observable>` | -| **MaxAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **MaxAsync**(this `Observable` source, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task` | -| **MaxAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **MaxAsync**(this `Observable` source, `Func` selector, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task` | -| **MaxByAsync**(this `Observable` source, `Func` keySelector, `CancellationToken` cancellationToken = default) | `Task` | -| **MaxByAsync**(this `Observable` source, `Func` keySelector, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task` | -| **Merge**(this `Observable` source, `Observable` second) | `Observable` | -| **MinAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **MinAsync**(this `Observable` source, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task` | -| **MinAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **MinAsync**(this `Observable` source, `Func` selector, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task` | -| **MinByAsync**(this `Observable` source, `Func` keySelector, `CancellationToken` cancellationToken = default) | `Task` | -| **MinByAsync**(this `Observable` source, `Func` keySelector, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task` | -| **MinMaxAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task>` | -| **MinMaxAsync**(this `Observable` source, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task>` | -| **MinMaxAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task>` | -| **MinMaxAsync**(this `Observable` source, `Func` selector, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task>` | -| **Multicast**(this `Observable` source, `ISubject` subject) | `ConnectableObservable` | -| **ObserveOn**(this `Observable` source, `SynchronizationContext` synchronizationContext) | `Observable` | -| **ObserveOn**(this `Observable` source, `TimeProvider` timeProvider) | `Observable` | -| **ObserveOn**(this `Observable` source, `FrameProvider` frameProvider) | `Observable` | -| **ObserveOnCurrentSynchronizationContext**(this `Observable` source) | `Observable` | -| **ObserveOnThreadPool**(this `Observable` source) | `Observable` | -| **OfType**(this `Observable` source) | `Observable` | -| **OnErrorResumeAsFailure**(this `Observable` source) | `Observable` | -| **Pairwise**(this `Observable` source) | `Observable>` | -| **Prepend**(this `Observable` source, `T` value) | `Observable` | -| **Publish**(this `Observable` source) | `ConnectableObservable` | -| **Publish**(this `Observable` source, `T` initialValue) | `ConnectableObservable` | -| **RefCount**(this `ConnectableObservable` source) | `Observable` | -| **Replay**(this `Observable` source) | `ConnectableObservable` | -| **Replay**(this `Observable` source, `Int32` bufferSize) | `ConnectableObservable` | -| **Replay**(this `Observable` source, `TimeSpan` window) | `ConnectableObservable` | -| **Replay**(this `Observable` source, `TimeSpan` window, `TimeProvider` timeProvider) | `ConnectableObservable` | -| **Replay**(this `Observable` source, `Int32` bufferSize, `TimeSpan` window) | `ConnectableObservable` | -| **Replay**(this `Observable` source, `Int32` bufferSize, `TimeSpan` window, `TimeProvider` timeProvider) | `ConnectableObservable` | -| **ReplayFrame**(this `Observable` source, `Int32` window) | `ConnectableObservable` | -| **ReplayFrame**(this `Observable` source, `Int32` window, `FrameProvider` frameProvider) | `ConnectableObservable` | -| **ReplayFrame**(this `Observable` source, `Int32` bufferSize, `Int32` window) | `ConnectableObservable` | -| **ReplayFrame**(this `Observable` source, `Int32` bufferSize, `Int32` window, `FrameProvider` frameProvider) | `ConnectableObservable` | -| **Scan**(this `Observable` source, `Func` accumulator) | `Observable` | -| **Scan**(this `Observable` source, `TAccumulate` seed, `Func` accumulator) | `Observable` | -| **Select**(this `Observable` source, `Func` selector) | `Observable` | -| **Select**(this `Observable` source, `Func` selector) | `Observable` | -| **Select**(this `Observable` source, `TState` state, `Func` selector) | `Observable` | -| **Select**(this `Observable` source, `TState` state, `Func` selector) | `Observable` | -| **SelectAwait**(this `Observable` source, `Func>` selector, `AwaitOperation` awaitOperations = Sequential, `Boolean` configureAwait = True, `Int32` maxConcurrent = -1) | `Observable` | -| **SelectMany**(this `Observable` source, `Func>` selector) | `Observable` | -| **SelectMany**(this `Observable` source, `Func>` collectionSelector, `Func` resultSelector) | `Observable` | -| **SelectMany**(this `Observable` source, `Func>` selector) | `Observable` | -| **SelectMany**(this `Observable` source, `Func>` collectionSelector, `Func` resultSelector) | `Observable` | -| **SequenceEqualAsync**(this `Observable` source, `Observable` second, `CancellationToken` cancellationToken = default) | `Task` | -| **SequenceEqualAsync**(this `Observable` source, `Observable` second, `IEqualityComparer` equalityComparer, `CancellationToken` cancellationToken = default) | `Task` | -| **Share**(this `Observable` source) | `Observable` | -| **SingleAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **SingleAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | -| **SingleOrDefaultAsync**(this `Observable` source, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | -| **SingleOrDefaultAsync**(this `Observable` source, `Func` predicate, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | -| **Skip**(this `Observable` source, `Int32` count) | `Observable` | -| **Skip**(this `Observable` source, `TimeSpan` duration) | `Observable` | -| **Skip**(this `Observable` source, `TimeSpan` duration, `TimeProvider` timeProvider) | `Observable` | -| **SkipFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | -| **SkipFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | -| **SkipLast**(this `Observable` source, `Int32` count) | `Observable` | -| **SkipLast**(this `Observable` source, `TimeSpan` duration) | `Observable` | -| **SkipLast**(this `Observable` source, `TimeSpan` duration, `TimeProvider` timeProvider) | `Observable` | -| **SkipLastFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | -| **SkipLastFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | -| **SkipUntil**(this `Observable` source, `Observable` other) | `Observable` | -| **SkipUntil**(this `Observable` source, `CancellationToken` cancellationToken) | `Observable` | -| **SkipUntil**(this `Observable` source, `Task` task) | `Observable` | -| **SkipWhile**(this `Observable` source, `Func` predicate) | `Observable` | -| **SkipWhile**(this `Observable` source, `Func` predicate) | `Observable` | -| **SubscribeAwait**(this `Observable` source, `Func` onNextAsync, `AwaitOperation` awaitOperations = Sequential, `Boolean` configureAwait = True, `Int32` maxConcurrent = -1) | `IDisposable` | -| **SubscribeAwait**(this `Observable` source, `Func` onNextAsync, `Action` onCompleted, `AwaitOperation` awaitOperations = Sequential, `Boolean` configureAwait = True, `Int32` maxConcurrent = -1) | `IDisposable` | -| **SubscribeAwait**(this `Observable` source, `Func` onNextAsync, `Action` onErrorResume, `Action` onCompleted, `AwaitOperation` awaitOperations = Sequential, `Boolean` configureAwait = True, `Int32` maxConcurrent = -1) | `IDisposable` | -| **SubscribeOn**(this `Observable` source, `SynchronizationContext` synchronizationContext) | `Observable` | -| **SubscribeOn**(this `Observable` source, `TimeProvider` timeProvider) | `Observable` | -| **SubscribeOn**(this `Observable` source, `FrameProvider` frameProvider) | `Observable` | -| **SubscribeOnCurrentSynchronizationContext**(this `Observable` source) | `Observable` | -| **SubscribeOnThreadPool**(this `Observable` source) | `Observable` | -| **SumAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **SumAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **SumAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **SumAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **SumAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **SumAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **SumAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **SumAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **SumAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **SumAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **SumAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **SumAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | -| **Switch**(this `Observable>` sources) | `Observable` | -| **Synchronize**(this `Observable` source) | `Observable` | -| **Synchronize**(this `Observable` source, `Object` gate) | `Observable` | -| **Take**(this `Observable` source, `Int32` count) | `Observable` | -| **Take**(this `Observable` source, `TimeSpan` duration) | `Observable` | -| **Take**(this `Observable` source, `TimeSpan` duration, `TimeProvider` timeProvider) | `Observable` | -| **TakeFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | -| **TakeFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | -| **TakeLast**(this `Observable` source, `Int32` count) | `Observable` | -| **TakeLast**(this `Observable` source, `TimeSpan` duration) | `Observable` | -| **TakeLast**(this `Observable` source, `TimeSpan` duration, `TimeProvider` timeProvider) | `Observable` | -| **TakeLastFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | -| **TakeLastFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | -| **TakeUntil**(this `Observable` source, `Observable` other) | `Observable` | -| **TakeUntil**(this `Observable` source, `CancellationToken` cancellationToken) | `Observable` | -| **TakeUntil**(this `Observable` source, `Task` task) | `Observable` | -| **TakeWhile**(this `Observable` source, `Func` predicate) | `Observable` | -| **TakeWhile**(this `Observable` source, `Func` predicate) | `Observable` | -| **ThrottleFirst**(this `Observable` source, `TimeSpan` timeSpan) | `Observable` | -| **ThrottleFirst**(this `Observable` source, `TimeSpan` timeSpan, `TimeProvider` timeProvider) | `Observable` | -| **ThrottleFirst**(this `Observable` source, `Observable` sampler) | `Observable` | -| **ThrottleFirst**(this `Observable` source, `Func` sampler, `Boolean` configureAwait = True) | `Observable` | -| **ThrottleFirstFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | -| **ThrottleFirstFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | -| **ThrottleLast**(this `Observable` source, `TimeSpan` timeSpan) | `Observable` | -| **ThrottleLast**(this `Observable` source, `TimeSpan` timeSpan, `TimeProvider` timeProvider) | `Observable` | -| **ThrottleLast**(this `Observable` source, `Observable` sampler) | `Observable` | -| **ThrottleLast**(this `Observable` source, `Func` sampler, `Boolean` configureAwait = True) | `Observable` | -| **ThrottleLastFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | -| **ThrottleLastFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | -| **Timeout**(this `Observable` source, `TimeSpan` dueTime) | `Observable` | -| **Timeout**(this `Observable` source, `TimeSpan` dueTime, `TimeProvider` timeProvider) | `Observable` | -| **TimeoutFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | -| **TimeoutFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | -| **ToArrayAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **ToAsyncEnumerable**(this `Observable` source, `CancellationToken` cancellationToken = default) | `IAsyncEnumerable` | -| **ToDictionaryAsync**(this `Observable` source, `Func` keySelector, `CancellationToken` cancellationToken = default) | `Task>` | -| **ToDictionaryAsync**(this `Observable` source, `Func` keySelector, `IEqualityComparer` keyComparer, `CancellationToken` cancellationToken = default) | `Task>` | -| **ToDictionaryAsync**(this `Observable` source, `Func` keySelector, `Func` elementSelector, `CancellationToken` cancellationToken = default) | `Task>` | -| **ToDictionaryAsync**(this `Observable` source, `Func` keySelector, `Func` elementSelector, `IEqualityComparer` keyComparer, `CancellationToken` cancellationToken = default) | `Task>` | -| **ToHashSetAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task>` | -| **ToHashSetAsync**(this `Observable` source, `IEqualityComparer` comparer, `CancellationToken` cancellationToken = default) | `Task>` | -| **ToListAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task>` | -| **ToLiveList**(this `Observable` source) | `LiveList` | -| **ToLiveList**(this `Observable` source, `Int32` bufferSize) | `LiveList` | -| **ToLookupAsync**(this `Observable` source, `Func` keySelector, `CancellationToken` cancellationToken = default) | `Task>` | -| **ToLookupAsync**(this `Observable` source, `Func` keySelector, `IEqualityComparer` keyComparer, `CancellationToken` cancellationToken = default) | `Task>` | -| **ToLookupAsync**(this `Observable` source, `Func` keySelector, `Func` elementSelector, `CancellationToken` cancellationToken = default) | `Task>` | -| **ToLookupAsync**(this `Observable` source, `Func` keySelector, `Func` elementSelector, `IEqualityComparer` keyComparer, `CancellationToken` cancellationToken = default) | `Task>` | -| **Trampoline**(this `Observable` source) | `Observable` | -| **WaitAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | -| **Where**(this `Observable` source, `Func` predicate) | `Observable` | -| **Where**(this `Observable` source, `Func` predicate) | `Observable` | -| **Where**(this `Observable` source, `TState` state, `Func` predicate) | `Observable` | -| **Where**(this `Observable` source, `TState` state, `Func` predicate) | `Observable` | -| **WhereAwait**(this `Observable` source, `Func>` predicate, `AwaitOperation` awaitOperations = Sequential, `Boolean` configureAwait = True, `Int32` maxConcurrent = -1) | `Observable` | -| **WithLatestFrom**(this `Observable` first, `Observable` second, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Observable` source14, `Func` resultSelector) | `Observable` | -| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Observable` source14, `Observable` source15, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Observable` source14, `Func` resultSelector) | `Observable` | -| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Observable` source14, `Observable` source15, `Func` resultSelector) | `Observable` | +| Name(Parameter) | ReturnType | +| --- | --- | +| **AggregateAsync**(this `Observable` source, `Func` func, `CancellationToken` cancellationToken = default) | `Task` | +| **AggregateAsync**(this `Observable` source, `TResult` seed, `Func` func, `CancellationToken` cancellationToken = default) | `Task` | +| **AggregateAsync**(this `Observable` source, `TAccumulate` seed, `Func` func, `Func` resultSelector, `CancellationToken` cancellationToken = default) | `Task` | +| **AllAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | +| **Amb**(this `Observable` source, `Observable` second) | `Observable` | +| **AnyAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **AnyAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | +| **Append**(this `Observable` source, `T` value) | `Observable` | +| **AsObservable**(this `Observable` source) | `Observable` | +| **AsSystemObservable**(this `Observable` source) | `IObservable` | +| **AsUnitObservable**(this `Observable` source) | `Observable` | +| **AverageAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **AverageAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **AverageAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **AverageAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **AverageAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **AverageAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **AverageAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **AverageAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **AverageAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **AverageAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **AverageAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **AverageAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **Cast**(this `Observable` source) | `Observable` | +| **Catch**(this `Observable` source, `Observable` second) | `Observable` | +| **Catch**(this `Observable` source, `Func>` errorHandler) | `Observable` | +| **Chunk**(this `Observable` source, `Int32` count) | `Observable` | +| **Chunk**(this `Observable` source, `TimeSpan` timeSpan) | `Observable` | +| **Chunk**(this `Observable` source, `TimeSpan` timeSpan, `TimeProvider` timeProvider) | `Observable` | +| **Chunk**(this `Observable` source, `TimeSpan` timeSpan, `Int32` count) | `Observable` | +| **Chunk**(this `Observable` source, `TimeSpan` timeSpan, `Int32` count, `TimeProvider` timeProvider) | `Observable` | +| **Chunk**(this `Observable` source, `Observable` windowBoundaries) | `Observable` | +| **ChunkFrame**(this `Observable` source) | `Observable` | +| **ChunkFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | +| **ChunkFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | +| **ChunkFrame**(this `Observable` source, `Int32` frameCount, `Int32` count) | `Observable` | +| **ChunkFrame**(this `Observable` source, `Int32` frameCount, `Int32` count, `FrameProvider` frameProvider) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Func` resultSelector) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Func` resultSelector) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Func` resultSelector) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Func` resultSelector) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Func` resultSelector) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Func` resultSelector) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Func` resultSelector) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Func` resultSelector) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Func` resultSelector) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Func` resultSelector) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Func` resultSelector) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Func` resultSelector) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Observable` source14, `Func` resultSelector) | `Observable` | +| **CombineLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Observable` source14, `Observable` source15, `Func` resultSelector) | `Observable` | +| **Concat**(this `Observable` source, `Observable` second) | `Observable` | +| **ContainsAsync**(this `Observable` source, `T` value, `CancellationToken` cancellationToken = default) | `Task` | +| **ContainsAsync**(this `Observable` source, `T` value, `IEqualityComparer` equalityComparer, `CancellationToken` cancellationToken = default) | `Task` | +| **CountAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **CountAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | +| **Debounce**(this `Observable` source, `TimeSpan` timeSpan) | `Observable` | +| **Debounce**(this `Observable` source, `TimeSpan` timeSpan, `TimeProvider` timeProvider) | `Observable` | +| **Debounce**(this `Observable` source, `Func` throttleDurationSelector, `Boolean` configureAwait = True) | `Observable` | +| **DebounceFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | +| **DebounceFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | +| **DefaultIfEmpty**(this `Observable` source) | `Observable` | +| **DefaultIfEmpty**(this `Observable` source, `T` defaultValue) | `Observable` | +| **Delay**(this `Observable` source, `TimeSpan` dueTime) | `Observable` | +| **Delay**(this `Observable` source, `TimeSpan` dueTime, `TimeProvider` timeProvider) | `Observable` | +| **DelayFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | +| **DelayFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | +| **DelaySubscription**(this `Observable` source, `TimeSpan` dueTime) | `Observable` | +| **DelaySubscription**(this `Observable` source, `TimeSpan` dueTime, `TimeProvider` timeProvider) | `Observable` | +| **DelaySubscriptionFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | +| **DelaySubscriptionFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | +| **Dematerialize**(this `Observable>` source) | `Observable` | +| **Distinct**(this `Observable` source) | `Observable` | +| **Distinct**(this `Observable` source, `IEqualityComparer` comparer) | `Observable` | +| **DistinctBy**(this `Observable` source, `Func` keySelector) | `Observable` | +| **DistinctBy**(this `Observable` source, `Func` keySelector, `IEqualityComparer` comparer) | `Observable` | +| **DistinctUntilChanged**(this `Observable` source) | `Observable` | +| **DistinctUntilChanged**(this `Observable` source, `IEqualityComparer` comparer) | `Observable` | +| **DistinctUntilChangedBy**(this `Observable` source, `Func` keySelector) | `Observable` | +| **DistinctUntilChangedBy**(this `Observable` source, `Func` keySelector, `IEqualityComparer` comparer) | `Observable` | +| **Do**(this `Observable` source, `Action` onNext = default, `Action` onErrorResume = default, `Action` onCompleted = default, `Action` onDispose = default, `Action` onSubscribe = default) | `Observable` | +| **Do**(this `Observable` source, `TState` state, `Action` onNext = default, `Action` onErrorResume = default, `Action` onCompleted = default, `Action` onDispose = default, `Action` onSubscribe = default) | `Observable` | +| **DoCancelOnCompleted**(this `Observable` source, `CancellationTokenSource` cancellationTokenSource) | `Observable` | +| **ElementAtAsync**(this `Observable` source, `Int32` index, `CancellationToken` cancellationToken = default) | `Task` | +| **ElementAtAsync**(this `Observable` source, `Index` index, `CancellationToken` cancellationToken = default) | `Task` | +| **ElementAtOrDefaultAsync**(this `Observable` source, `Int32` index, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | +| **ElementAtOrDefaultAsync**(this `Observable` source, `Index` index, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | +| **FirstAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **FirstAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | +| **FirstOrDefaultAsync**(this `Observable` source, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | +| **FirstOrDefaultAsync**(this `Observable` source, `Func` predicate, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | +| **ForEachAsync**(this `Observable` source, `Action` action, `CancellationToken` cancellationToken = default) | `Task` | +| **ForEachAsync**(this `Observable` source, `Action` action, `CancellationToken` cancellationToken = default) | `Task` | +| **IgnoreElements**(this `Observable` source) | `Observable` | +| **IgnoreElements**(this `Observable` source, `Action` doOnNext) | `Observable` | +| **IgnoreOnErrorResume**(this `Observable` source) | `Observable` | +| **IgnoreOnErrorResume**(this `Observable` source, `Action` doOnErrorResume) | `Observable` | +| **IsEmptyAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **LastAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **LastAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | +| **LastOrDefaultAsync**(this `Observable` source, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | +| **LastOrDefaultAsync**(this `Observable` source, `Func` predicate, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | +| **LongCountAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **LongCountAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | +| **Materialize**(this `Observable` source) | `Observable>` | +| **MaxAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **MaxAsync**(this `Observable` source, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task` | +| **MaxAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **MaxAsync**(this `Observable` source, `Func` selector, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task` | +| **MaxByAsync**(this `Observable` source, `Func` keySelector, `CancellationToken` cancellationToken = default) | `Task` | +| **MaxByAsync**(this `Observable` source, `Func` keySelector, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task` | +| **Merge**(this `Observable` source, `Observable` second) | `Observable` | +| **MinAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **MinAsync**(this `Observable` source, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task` | +| **MinAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **MinAsync**(this `Observable` source, `Func` selector, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task` | +| **MinByAsync**(this `Observable` source, `Func` keySelector, `CancellationToken` cancellationToken = default) | `Task` | +| **MinByAsync**(this `Observable` source, `Func` keySelector, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task` | +| **MinMaxAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task>` | +| **MinMaxAsync**(this `Observable` source, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task>` | +| **MinMaxAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task>` | +| **MinMaxAsync**(this `Observable` source, `Func` selector, `IComparer` comparer, `CancellationToken` cancellationToken = default) | `Task>` | +| **Multicast**(this `Observable` source, `ISubject` subject) | `ConnectableObservable` | +| **ObserveOn**(this `Observable` source, `SynchronizationContext` synchronizationContext) | `Observable` | +| **ObserveOn**(this `Observable` source, `TimeProvider` timeProvider) | `Observable` | +| **ObserveOn**(this `Observable` source, `FrameProvider` frameProvider) | `Observable` | +| **ObserveOnCurrentSynchronizationContext**(this `Observable` source) | `Observable` | +| **ObserveOnThreadPool**(this `Observable` source) | `Observable` | +| **OfType**(this `Observable` source) | `Observable` | +| **OnErrorResumeAsFailure**(this `Observable` source) | `Observable` | +| **Pairwise**(this `Observable` source) | `Observable>` | +| **Prepend**(this `Observable` source, `T` value) | `Observable` | +| **Publish**(this `Observable` source) | `ConnectableObservable` | +| **Publish**(this `Observable` source, `T` initialValue) | `ConnectableObservable` | +| **RefCount**(this `ConnectableObservable` source) | `Observable` | +| **Replay**(this `Observable` source) | `ConnectableObservable` | +| **Replay**(this `Observable` source, `Int32` bufferSize) | `ConnectableObservable` | +| **Replay**(this `Observable` source, `TimeSpan` window) | `ConnectableObservable` | +| **Replay**(this `Observable` source, `TimeSpan` window, `TimeProvider` timeProvider) | `ConnectableObservable` | +| **Replay**(this `Observable` source, `Int32` bufferSize, `TimeSpan` window) | `ConnectableObservable` | +| **Replay**(this `Observable` source, `Int32` bufferSize, `TimeSpan` window, `TimeProvider` timeProvider) | `ConnectableObservable` | +| **ReplayFrame**(this `Observable` source, `Int32` window) | `ConnectableObservable` | +| **ReplayFrame**(this `Observable` source, `Int32` window, `FrameProvider` frameProvider) | `ConnectableObservable` | +| **ReplayFrame**(this `Observable` source, `Int32` bufferSize, `Int32` window) | `ConnectableObservable` | +| **ReplayFrame**(this `Observable` source, `Int32` bufferSize, `Int32` window, `FrameProvider` frameProvider) | `ConnectableObservable` | +| **Scan**(this `Observable` source, `Func` accumulator) | `Observable` | +| **Scan**(this `Observable` source, `TAccumulate` seed, `Func` accumulator) | `Observable` | +| **Select**(this `Observable` source, `Func` selector) | `Observable` | +| **Select**(this `Observable` source, `Func` selector) | `Observable` | +| **Select**(this `Observable` source, `TState` state, `Func` selector) | `Observable` | +| **Select**(this `Observable` source, `TState` state, `Func` selector) | `Observable` | +| **SelectAwait**(this `Observable` source, `Func>` selector, `AwaitOperation` awaitOperations = Sequential, `Boolean` configureAwait = True, `Int32` maxConcurrent = -1) | `Observable` | +| **SelectMany**(this `Observable` source, `Func>` selector) | `Observable` | +| **SelectMany**(this `Observable` source, `Func>` collectionSelector, `Func` resultSelector) | `Observable` | +| **SelectMany**(this `Observable` source, `Func>` selector) | `Observable` | +| **SelectMany**(this `Observable` source, `Func>` collectionSelector, `Func` resultSelector) | `Observable` | +| **SequenceEqualAsync**(this `Observable` source, `Observable` second, `CancellationToken` cancellationToken = default) | `Task` | +| **SequenceEqualAsync**(this `Observable` source, `Observable` second, `IEqualityComparer` equalityComparer, `CancellationToken` cancellationToken = default) | `Task` | +| **Share**(this `Observable` source) | `Observable` | +| **SingleAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **SingleAsync**(this `Observable` source, `Func` predicate, `CancellationToken` cancellationToken = default) | `Task` | +| **SingleOrDefaultAsync**(this `Observable` source, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | +| **SingleOrDefaultAsync**(this `Observable` source, `Func` predicate, `T` defaultValue = default, `CancellationToken` cancellationToken = default) | `Task` | +| **Skip**(this `Observable` source, `Int32` count) | `Observable` | +| **Skip**(this `Observable` source, `TimeSpan` duration) | `Observable` | +| **Skip**(this `Observable` source, `TimeSpan` duration, `TimeProvider` timeProvider) | `Observable` | +| **SkipFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | +| **SkipFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | +| **SkipLast**(this `Observable` source, `Int32` count) | `Observable` | +| **SkipLast**(this `Observable` source, `TimeSpan` duration) | `Observable` | +| **SkipLast**(this `Observable` source, `TimeSpan` duration, `TimeProvider` timeProvider) | `Observable` | +| **SkipLastFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | +| **SkipLastFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | +| **SkipUntil**(this `Observable` source, `Observable` other) | `Observable` | +| **SkipUntil**(this `Observable` source, `CancellationToken` cancellationToken) | `Observable` | +| **SkipUntil**(this `Observable` source, `Task` task) | `Observable` | +| **SkipWhile**(this `Observable` source, `Func` predicate) | `Observable` | +| **SkipWhile**(this `Observable` source, `Func` predicate) | `Observable` | +| **SubscribeAwait**(this `Observable` source, `Func` onNextAsync, `AwaitOperation` awaitOperations = Sequential, `Boolean` configureAwait = True, `Int32` maxConcurrent = -1) | `IDisposable` | +| **SubscribeAwait**(this `Observable` source, `Func` onNextAsync, `Action` onCompleted, `AwaitOperation` awaitOperations = Sequential, `Boolean` configureAwait = True, `Int32` maxConcurrent = -1) | `IDisposable` | +| **SubscribeAwait**(this `Observable` source, `Func` onNextAsync, `Action` onErrorResume, `Action` onCompleted, `AwaitOperation` awaitOperations = Sequential, `Boolean` configureAwait = True, `Int32` maxConcurrent = -1) | `IDisposable` | +| **SubscribeOn**(this `Observable` source, `SynchronizationContext` synchronizationContext) | `Observable` | +| **SubscribeOn**(this `Observable` source, `TimeProvider` timeProvider) | `Observable` | +| **SubscribeOn**(this `Observable` source, `FrameProvider` frameProvider) | `Observable` | +| **SubscribeOnCurrentSynchronizationContext**(this `Observable` source) | `Observable` | +| **SubscribeOnThreadPool**(this `Observable` source) | `Observable` | +| **SumAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **SumAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **SumAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **SumAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **SumAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **SumAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **SumAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **SumAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **SumAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **SumAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **SumAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **SumAsync**(this `Observable` source, `Func` selector, `CancellationToken` cancellationToken = default) | `Task` | +| **Switch**(this `Observable>` sources) | `Observable` | +| **Synchronize**(this `Observable` source) | `Observable` | +| **Synchronize**(this `Observable` source, `Object` gate) | `Observable` | +| **Take**(this `Observable` source, `Int32` count) | `Observable` | +| **Take**(this `Observable` source, `TimeSpan` duration) | `Observable` | +| **Take**(this `Observable` source, `TimeSpan` duration, `TimeProvider` timeProvider) | `Observable` | +| **TakeFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | +| **TakeFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | +| **TakeLast**(this `Observable` source, `Int32` count) | `Observable` | +| **TakeLast**(this `Observable` source, `TimeSpan` duration) | `Observable` | +| **TakeLast**(this `Observable` source, `TimeSpan` duration, `TimeProvider` timeProvider) | `Observable` | +| **TakeLastFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | +| **TakeLastFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | +| **TakeUntil**(this `Observable` source, `Observable` other) | `Observable` | +| **TakeUntil**(this `Observable` source, `CancellationToken` cancellationToken) | `Observable` | +| **TakeUntil**(this `Observable` source, `Task` task) | `Observable` | +| **TakeWhile**(this `Observable` source, `Func` predicate) | `Observable` | +| **TakeWhile**(this `Observable` source, `Func` predicate) | `Observable` | +| **ThrottleFirst**(this `Observable` source, `TimeSpan` timeSpan) | `Observable` | +| **ThrottleFirst**(this `Observable` source, `TimeSpan` timeSpan, `TimeProvider` timeProvider) | `Observable` | +| **ThrottleFirst**(this `Observable` source, `Observable` sampler) | `Observable` | +| **ThrottleFirst**(this `Observable` source, `Func` sampler, `Boolean` configureAwait = True) | `Observable` | +| **ThrottleFirstFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | +| **ThrottleFirstFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | +| **ThrottleLast**(this `Observable` source, `TimeSpan` timeSpan) | `Observable` | +| **ThrottleLast**(this `Observable` source, `TimeSpan` timeSpan, `TimeProvider` timeProvider) | `Observable` | +| **ThrottleLast**(this `Observable` source, `Observable` sampler) | `Observable` | +| **ThrottleLast**(this `Observable` source, `Func` sampler, `Boolean` configureAwait = True) | `Observable` | +| **ThrottleLastFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | +| **ThrottleLastFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | +| **Timeout**(this `Observable` source, `TimeSpan` dueTime) | `Observable` | +| **Timeout**(this `Observable` source, `TimeSpan` dueTime, `TimeProvider` timeProvider) | `Observable` | +| **TimeoutFrame**(this `Observable` source, `Int32` frameCount) | `Observable` | +| **TimeoutFrame**(this `Observable` source, `Int32` frameCount, `FrameProvider` frameProvider) | `Observable` | +| **ToArrayAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **ToAsyncEnumerable**(this `Observable` source, `CancellationToken` cancellationToken = default) | `IAsyncEnumerable` | +| **ToDictionaryAsync**(this `Observable` source, `Func` keySelector, `CancellationToken` cancellationToken = default) | `Task>` | +| **ToDictionaryAsync**(this `Observable` source, `Func` keySelector, `IEqualityComparer` keyComparer, `CancellationToken` cancellationToken = default) | `Task>` | +| **ToDictionaryAsync**(this `Observable` source, `Func` keySelector, `Func` elementSelector, `CancellationToken` cancellationToken = default) | `Task>` | +| **ToDictionaryAsync**(this `Observable` source, `Func` keySelector, `Func` elementSelector, `IEqualityComparer` keyComparer, `CancellationToken` cancellationToken = default) | `Task>` | +| **ToHashSetAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task>` | +| **ToHashSetAsync**(this `Observable` source, `IEqualityComparer` comparer, `CancellationToken` cancellationToken = default) | `Task>` | +| **ToListAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task>` | +| **ToLiveList**(this `Observable` source) | `LiveList` | +| **ToLiveList**(this `Observable` source, `Int32` bufferSize) | `LiveList` | +| **ToLookupAsync**(this `Observable` source, `Func` keySelector, `CancellationToken` cancellationToken = default) | `Task>` | +| **ToLookupAsync**(this `Observable` source, `Func` keySelector, `IEqualityComparer` keyComparer, `CancellationToken` cancellationToken = default) | `Task>` | +| **ToLookupAsync**(this `Observable` source, `Func` keySelector, `Func` elementSelector, `CancellationToken` cancellationToken = default) | `Task>` | +| **ToLookupAsync**(this `Observable` source, `Func` keySelector, `Func` elementSelector, `IEqualityComparer` keyComparer, `CancellationToken` cancellationToken = default) | `Task>` | +| **Trampoline**(this `Observable` source) | `Observable` | +| **WaitAsync**(this `Observable` source, `CancellationToken` cancellationToken = default) | `Task` | +| **Where**(this `Observable` source, `Func` predicate) | `Observable` | +| **Where**(this `Observable` source, `Func` predicate) | `Observable` | +| **Where**(this `Observable` source, `TState` state, `Func` predicate) | `Observable` | +| **Where**(this `Observable` source, `TState` state, `Func` predicate) | `Observable` | +| **WhereAwait**(this `Observable` source, `Func>` predicate, `AwaitOperation` awaitOperations = Sequential, `Boolean` configureAwait = True, `Int32` maxConcurrent = -1) | `Observable` | +| **WithLatestFrom**(this `Observable` first, `Observable` second, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Observable` source14, `Func` resultSelector) | `Observable` | +| **Zip**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Observable` source14, `Observable` source15, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Observable` source14, `Func` resultSelector) | `Observable` | +| **ZipLatest**(this `Observable` source1, `Observable` source2, `Observable` source3, `Observable` source4, `Observable` source5, `Observable` source6, `Observable` source7, `Observable` source8, `Observable` source9, `Observable` source10, `Observable` source11, `Observable` source12, `Observable` source13, `Observable` source14, `Observable` source15, `Func` resultSelector) | `Observable` | In dotnet/reactive, methods that return a single `IObservable` (such as `First`) are all provided only as `***Async`, returning `Task`. Additionally, to align with the naming of Enumerable, `Buffer` has been changed to `Chunk`. @@ -1688,4 +1735,4 @@ Class/Method name changes from dotnet/reactive and neuecc/UniRx License --- -This library is under the MIT License. \ No newline at end of file +This library is under the MIT License. diff --git a/sandbox/MonoGameApplication1/.config/dotnet-tools.json b/sandbox/MonoGameApplication1/.config/dotnet-tools.json new file mode 100644 index 00000000..efabe22e --- /dev/null +++ b/sandbox/MonoGameApplication1/.config/dotnet-tools.json @@ -0,0 +1,36 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-mgcb": { + "version": "3.8.1.303", + "commands": [ + "mgcb" + ] + }, + "dotnet-mgcb-editor": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor" + ] + }, + "dotnet-mgcb-editor-linux": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-linux" + ] + }, + "dotnet-mgcb-editor-windows": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-windows" + ] + }, + "dotnet-mgcb-editor-mac": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-mac" + ] + } + } +} \ No newline at end of file diff --git a/sandbox/MonoGameApplication1/Content/Content.mgcb b/sandbox/MonoGameApplication1/Content/Content.mgcb new file mode 100644 index 00000000..ddc4c367 --- /dev/null +++ b/sandbox/MonoGameApplication1/Content/Content.mgcb @@ -0,0 +1,15 @@ + +#----------------------------- Global Properties ----------------------------# + +/outputDir:bin/$(Platform) +/intermediateDir:obj/$(Platform) +/platform:DesktopGL +/config: +/profile:Reach +/compress:False + +#-------------------------------- References --------------------------------# + + +#---------------------------------- Content ---------------------------------# + diff --git a/sandbox/MonoGameApplication1/Game1.cs b/sandbox/MonoGameApplication1/Game1.cs new file mode 100644 index 00000000..d193845a --- /dev/null +++ b/sandbox/MonoGameApplication1/Game1.cs @@ -0,0 +1,80 @@ +using System; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; +using R3; + +namespace MonoGameApplication1; + +class SampleComponent : GameComponent +{ + public SampleComponent(Game game) : base(game) + { + } + + public override void Initialize() + { + Observable.Interval(TimeSpan.FromMilliseconds(500)) + .GameTime() + .Subscribe(x => + { + Console.WriteLine($"ElapsedGameTime={x.ElapsedGameTime} TotalGameTime={x.TotalGameTime}"); + }); + + Observable.IntervalFrame(10) + .Subscribe(x => + { + Console.WriteLine($"Frame: {ObservableSystem.DefaultFrameProvider.GetFrameCount()}"); + }); + } +} + +public class Game1 : Game +{ + private GraphicsDeviceManager _graphics; + private SpriteBatch _spriteBatch; + + public Game1() + { + _graphics = new GraphicsDeviceManager(this); + Content.RootDirectory = "Content"; + IsMouseVisible = true; + + Components.Add(new ObservableSystemComponent(this)); + Components.Add(new SampleComponent(this)); + } + + protected override void Initialize() + { + // TODO: Add your initialization logic here + + base.Initialize(); + } + + protected override void LoadContent() + { + _spriteBatch = new SpriteBatch(GraphicsDevice); + + // TODO: use this.Content to load your game content here + } + + protected override void Update(GameTime gameTime) + { + if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || + Keyboard.GetState().IsKeyDown(Keys.Escape)) + Exit(); + + // TODO: Add your update logic here + + base.Update(gameTime); + } + + protected override void Draw(GameTime gameTime) + { + GraphicsDevice.Clear(Color.CornflowerBlue); + + // TODO: Add your drawing code here + + base.Draw(gameTime); + } +} diff --git a/sandbox/MonoGameApplication1/Icon.bmp b/sandbox/MonoGameApplication1/Icon.bmp new file mode 100644 index 00000000..2b481653 Binary files /dev/null and b/sandbox/MonoGameApplication1/Icon.bmp differ diff --git a/sandbox/MonoGameApplication1/Icon.ico b/sandbox/MonoGameApplication1/Icon.ico new file mode 100644 index 00000000..7d9dec18 Binary files /dev/null and b/sandbox/MonoGameApplication1/Icon.ico differ diff --git a/sandbox/MonoGameApplication1/MonoGameApplication1.csproj b/sandbox/MonoGameApplication1/MonoGameApplication1.csproj new file mode 100644 index 00000000..57e285e1 --- /dev/null +++ b/sandbox/MonoGameApplication1/MonoGameApplication1.csproj @@ -0,0 +1,32 @@ + + + WinExe + net6.0 + Major + false + false + + + app.manifest + Icon.ico + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sandbox/MonoGameApplication1/Program.cs b/sandbox/MonoGameApplication1/Program.cs new file mode 100644 index 00000000..df66534d --- /dev/null +++ b/sandbox/MonoGameApplication1/Program.cs @@ -0,0 +1,2 @@ +using var game = new MonoGameApplication1.Game1(); +game.Run(); diff --git a/sandbox/MonoGameApplication1/app.manifest b/sandbox/MonoGameApplication1/app.manifest new file mode 100644 index 00000000..0d72807f --- /dev/null +++ b/sandbox/MonoGameApplication1/app.manifest @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true/pm + permonitorv2,permonitor + + + + diff --git a/src/R3.MonoGame/MonoGameFrameProvider.cs b/src/R3.MonoGame/MonoGameFrameProvider.cs new file mode 100644 index 00000000..b2789c1c --- /dev/null +++ b/src/R3.MonoGame/MonoGameFrameProvider.cs @@ -0,0 +1,90 @@ +using System; +using R3.Collections; + +namespace R3; + +public class MonoGameFrameProvider : FrameProvider +{ + public static readonly MonoGameFrameProvider Update = new(); + + readonly object gate = new(); + FreeListCore list; + long frameCount; + bool disposed; + + // frame loop is delayed until first register + bool running; + + public MonoGameFrameProvider() + { + list = new FreeListCore(gate); + } + + public override long GetFrameCount() + { + ThrowIfDisposed(); + return frameCount; + } + + public override void Register(IFrameRunnerWorkItem callback) + { + ThrowIfDisposed(); + lock (gate) + { + running = true; + list.Add(callback, out _); + } + } + + public void Dispose() + { + lock (gate) + { + disposed = true; + list.Dispose(); + } + } + + public void Tick() + { + if (!running) return; + + frameCount++; + + var span = list.AsSpan(); + for (int i = 0; i < span.Length; i++) + { + ref readonly var item = ref span[i]; + if (item != null) + { + try + { + if (!item.MoveNext(frameCount)) + { + list.Remove(i); + } + } + catch (Exception ex) + { + list.Remove(i); + try + { + ObservableSystem.GetUnhandledExceptionHandler().Invoke(ex); + } + catch + { + // ignored + } + } + } + } + } + + void ThrowIfDisposed() + { + if (disposed) + { + throw new ObjectDisposedException(typeof(MonoGameFrameProvider).FullName); + } + } +} diff --git a/src/R3.MonoGame/MonoGameObservableExtensions.cs b/src/R3.MonoGame/MonoGameObservableExtensions.cs new file mode 100644 index 00000000..220e1806 --- /dev/null +++ b/src/R3.MonoGame/MonoGameObservableExtensions.cs @@ -0,0 +1,75 @@ +using System; +using Microsoft.Xna.Framework; + +namespace R3; + +public static class MonoGameObservableExtensions +{ + /// + /// Observe the current GameTime once. + /// + public static Observable GameTime(this Observable source) + { + return new GameTimeObservable(source, MonoGameTimeProvider.Update); + } + + /// + /// Observes the current GameTime and the value of the source observable. + /// + public static Observable<(GameTime GameTime, T Item)> GameTime(this Observable source) + { + return new GameTimeObservable(source, MonoGameTimeProvider.Update); + } +} + +internal sealed class GameTimeObservable(Observable source, MonoGameTimeProvider frameProvider) : Observable +{ + protected override IDisposable SubscribeCore(Observer observer) + { + return source.Subscribe(new _GameTime(observer, frameProvider)); + } + + sealed class _GameTime(Observer observer, MonoGameTimeProvider timeProvider) : Observer + { + protected override void OnNextCore(Unit value) + { + observer.OnNext(timeProvider.GameTime); + } + + protected override void OnErrorResumeCore(Exception error) + { + observer.OnErrorResume(error); + } + + protected override void OnCompletedCore(Result result) + { + observer.OnCompleted(result); + } + } +} + +internal sealed class GameTimeObservable(Observable source, MonoGameTimeProvider timeProvider) : Observable<(GameTime gameTime, T Item)> +{ + protected override IDisposable SubscribeCore(Observer<(GameTime gameTime, T Item)> observer) + { + return source.Subscribe(new _GameTime(observer, timeProvider)); + } + + sealed class _GameTime(Observer<(GameTime GameTime, T Item)> observer, MonoGameTimeProvider timeProvider) : Observer + { + protected override void OnNextCore(T value) + { + observer.OnNext((timeProvider.GameTime, value)); + } + + protected override void OnErrorResumeCore(Exception error) + { + observer.OnErrorResume(error); + } + + protected override void OnCompletedCore(Result result) + { + observer.OnCompleted(result); + } + } +} diff --git a/src/R3.MonoGame/MonoGameTimeProvider.cs b/src/R3.MonoGame/MonoGameTimeProvider.cs new file mode 100644 index 00000000..9202d1d7 --- /dev/null +++ b/src/R3.MonoGame/MonoGameTimeProvider.cs @@ -0,0 +1,257 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Xna.Framework; +using R3.Collections; + +namespace R3; + +public class MonoGameTimeProvider : TimeProvider, IDisposable +{ + public static readonly MonoGameTimeProvider Update = new(); + + public GameTime GameTime { get; private set; } = new(); + + FreeListCore list; + readonly object gate = new(); + + // frame loop is delayed until first register + bool running; + bool disposed; + + public MonoGameTimeProvider() + { + list = new FreeListCore(gate); + } + + public override ITimer CreateTimer(TimerCallback callback, object? state, TimeSpan dueTime, TimeSpan period) + { + return new FrameTimer(callback, state, dueTime, period, this); + } + + public override long GetTimestamp() + { + return GameTime.TotalGameTime.Ticks; + } + + public void Dispose() + { + lock (gate) + { + disposed = true; + list.Dispose(); + } + } + + public void Tick(GameTime gameTime) + { + if (!running) return; + + this.GameTime = gameTime; + + var span = list.AsSpan(); + for (var i = 0; i < span.Length; i++) + { + ref readonly var item = ref span[i]; + if (item != null) + { + try + { + if (!item.Tick(gameTime)) + { + list.Remove(i); + } + } + catch (Exception ex) + { + list.Remove(i); + try + { + ObservableSystem.GetUnhandledExceptionHandler().Invoke(ex); + } + catch + { + // ignored + } + } + } + } + } + + internal void Register(FrameTimer timer) + { + ThrowIfDisposed(); + lock (gate) + { + running = true; + list.Add(timer, out _); + } + } + + void ThrowIfDisposed() + { + if (disposed) + { + throw new ObjectDisposedException(typeof(MonoGameFrameProvider).FullName); + } + } +} + +internal sealed class FrameTimer : ITimer +{ + enum RunningState + { + Stop, + RunningDueTime, + RunningPeriod, + ChangeRequested + } + + readonly MonoGameTimeProvider timeProvider; + readonly TimerCallback callback; + readonly object? state; + readonly object gate = new(); + + TimeSpan dueTime; + TimeSpan period; + RunningState runningState; + double elapsed; + bool isDisposed; + + public FrameTimer(TimerCallback callback, object? state, TimeSpan dueTime, TimeSpan period, MonoGameTimeProvider timeProvider) + { + this.callback = callback; + this.state = state; + this.dueTime = dueTime; + this.period = period; + this.timeProvider = timeProvider; + Change(dueTime, period); + } + + public bool Change(TimeSpan dueTime, TimeSpan period) + { + if (isDisposed) return false; + + lock (gate) + { + this.dueTime = dueTime; + this.period = period; + + if (dueTime == Timeout.InfiniteTimeSpan) + { + if (runningState == RunningState.Stop) + { + return true; + } + } + + if (runningState == RunningState.Stop) + { + timeProvider.Register(this); + } + + runningState = RunningState.ChangeRequested; + } + return true; + } + + public bool Tick(GameTime gameTime) + { + if (isDisposed) return false; + + RunningState runState; + TimeSpan p; // period + TimeSpan d; // dueTime + lock (gate) + { + runState = runningState; + + if (runState == RunningState.ChangeRequested) + { + elapsed = 0; + if (dueTime == Timeout.InfiniteTimeSpan) + { + runningState = RunningState.Stop; + return false; + } + + runState = runningState = RunningState.RunningDueTime; + } + p = period; + d = dueTime; + } + + elapsed += gameTime.ElapsedGameTime.TotalSeconds; // ElapsedGameTime is delta time + + try + { + if (runState == RunningState.RunningDueTime) + { + var dt = (double)d.TotalSeconds; + if (elapsed >= dt) + { + callback(state); + + elapsed = 0; + if (period == Timeout.InfiniteTimeSpan) + { + return ChangeState(RunningState.Stop); + } + return ChangeState(RunningState.RunningPeriod); + } + return true; + } + else + { + var dt = (double)p.TotalSeconds; + if (elapsed >= dt) + { + callback(state); + elapsed = 0; + } + + return ChangeState(RunningState.RunningPeriod); + } + } + catch (Exception ex) + { + ObservableSystem.GetUnhandledExceptionHandler().Invoke(ex); + return ChangeState(RunningState.Stop); + } + } + + bool ChangeState(RunningState state) + { + lock (gate) + { + // change requested is high priority + if (runningState == RunningState.ChangeRequested) + { + return true; + } + + switch (state) + { + case RunningState.RunningPeriod: + runningState = state; + return true; + default: // otherwise(Stop) + runningState = state; + return false; + } + } + } + + public void Dispose() + { + Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan); + isDisposed = true; + } + + public ValueTask DisposeAsync() + { + Dispose(); + return default; + } +} + diff --git a/src/R3.MonoGame/ObservableSystemComponent.cs b/src/R3.MonoGame/ObservableSystemComponent.cs new file mode 100644 index 00000000..accb58a2 --- /dev/null +++ b/src/R3.MonoGame/ObservableSystemComponent.cs @@ -0,0 +1,25 @@ +using System; +using Microsoft.Xna.Framework; + +namespace R3; + +public class ObservableSystemComponent(Game game, Action exceptionHandler) : GameComponent(game) +{ + public ObservableSystemComponent(Game game) + : this(game, ex => System.Diagnostics.Trace.TraceError("R3 Unhandled Exception {0}", ex)) + { + } + + public override void Initialize() + { + ObservableSystem.RegisterUnhandledExceptionHandler(exceptionHandler); + ObservableSystem.DefaultTimeProvider = MonoGameTimeProvider.Update; + ObservableSystem.DefaultFrameProvider = MonoGameFrameProvider.Update; + } + + public override void Update(GameTime gameTime) + { + MonoGameTimeProvider.Update.Tick(gameTime); + MonoGameFrameProvider.Update.Tick(); + } +} diff --git a/src/R3.MonoGame/R3.MonoGame.csproj b/src/R3.MonoGame/R3.MonoGame.csproj new file mode 100644 index 00000000..0fb427ca --- /dev/null +++ b/src/R3.MonoGame/R3.MonoGame.csproj @@ -0,0 +1,30 @@ + + + + net6.0;net8.0 + enable + 12 + + true + 1701;1702;1591;1573 + + + R3Extensions.MonoGame + rx + MonoGame Provider and Methods for R3. + + + + + + + + + All + + + + + + +