From c094c3ccf404bf3099dfcd0154a7820a25a17bd7 Mon Sep 17 00:00:00 2001 From: hadashiA Date: Thu, 15 Feb 2024 18:35:56 +0900 Subject: [PATCH 1/4] Add MonoGame support --- R3.sln | 14 + .../.config/dotnet-tools.json | 36 +++ .../MonoGameApplication1/Content/Content.mgcb | 15 ++ sandbox/MonoGameApplication1/Game1.cs | 67 +++++ sandbox/MonoGameApplication1/Icon.bmp | Bin 0 -> 262282 bytes sandbox/MonoGameApplication1/Icon.ico | Bin 0 -> 147541 bytes .../MonoGameApplication1.csproj | 29 ++ sandbox/MonoGameApplication1/Program.cs | 2 + sandbox/MonoGameApplication1/app.manifest | 43 +++ src/R3.MonoGame/MonoGameFrameProvider.cs | 90 +++++++ src/R3.MonoGame/MonoGameTimeProvider.cs | 255 ++++++++++++++++++ src/R3.MonoGame/ObservableSystemComponent.cs | 24 ++ src/R3.MonoGame/R3.MonoGame.csproj | 31 +++ 13 files changed, 606 insertions(+) create mode 100644 sandbox/MonoGameApplication1/.config/dotnet-tools.json create mode 100644 sandbox/MonoGameApplication1/Content/Content.mgcb create mode 100644 sandbox/MonoGameApplication1/Game1.cs create mode 100644 sandbox/MonoGameApplication1/Icon.bmp create mode 100644 sandbox/MonoGameApplication1/Icon.ico create mode 100644 sandbox/MonoGameApplication1/MonoGameApplication1.csproj create mode 100644 sandbox/MonoGameApplication1/Program.cs create mode 100644 sandbox/MonoGameApplication1/app.manifest create mode 100644 src/R3.MonoGame/MonoGameFrameProvider.cs create mode 100644 src/R3.MonoGame/MonoGameTimeProvider.cs create mode 100644 src/R3.MonoGame/ObservableSystemComponent.cs create mode 100644 src/R3.MonoGame/R3.MonoGame.csproj diff --git a/R3.sln b/R3.sln index 9202474d..9a7ae143 100644 --- a/R3.sln +++ b/R3.sln @@ -48,6 +48,10 @@ 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}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -119,6 +123,14 @@ Global {F1D6609C-AA33-4099-8932-BADBCB935FBD}.Debug|Any CPU.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 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -140,6 +152,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} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {84B77761-6B9E-46BA-B132-6C77B0B6E4FA} 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..c5943a39 --- /dev/null +++ b/sandbox/MonoGameApplication1/Game1.cs @@ -0,0 +1,67 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; + +namespace MonoGameApplication1; + +class HogeComponent : GameComponent +{ + public HogeComponent(Game game) : base(game) + { + } + + public override void Update(GameTime gameTime) + { + System.Console.WriteLine($"!!!!! {gameTime.ElapsedGameTime}"); + System.Diagnostics.Trace.WriteLine($"!!!!! {gameTime.ElapsedGameTime}"); + } +} + +public class Game1 : Game +{ + private GraphicsDeviceManager _graphics; + private SpriteBatch _spriteBatch; + + public Game1() + { + _graphics = new GraphicsDeviceManager(this); + Content.RootDirectory = "Content"; + IsMouseVisible = true; + + Components.Add(new HogeComponent(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 0000000000000000000000000000000000000000..2b481653e241818d2894e4ef33234eaff9aad701 GIT binary patch literal 262282 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 RJoIeLznU7AhJ`o~_y6Yy51#-4 literal 0 HcmV?d00001 diff --git a/sandbox/MonoGameApplication1/MonoGameApplication1.csproj b/sandbox/MonoGameApplication1/MonoGameApplication1.csproj new file mode 100644 index 00000000..8976cb97 --- /dev/null +++ b/sandbox/MonoGameApplication1/MonoGameApplication1.csproj @@ -0,0 +1,29 @@ + + + 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/MonoGameTimeProvider.cs b/src/R3.MonoGame/MonoGameTimeProvider.cs new file mode 100644 index 00000000..18102d06 --- /dev/null +++ b/src/R3.MonoGame/MonoGameTimeProvider.cs @@ -0,0 +1,255 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using R3.Collections; + +namespace R3.MonoGame; + +public class MonoGameTimeProvider : TimeProvider, IDisposable +{ + public static readonly MonoGameTimeProvider Update = new(); + + GameTime gameTime = 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..1d0f406e --- /dev/null +++ b/src/R3.MonoGame/ObservableSystemComponent.cs @@ -0,0 +1,24 @@ +using System; + +namespace R3.MonoGame; + +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..6ac01d18 --- /dev/null +++ b/src/R3.MonoGame/R3.MonoGame.csproj @@ -0,0 +1,31 @@ + + + + netstandard2.0;netstandard2.1;net6.0;net8.0 + disable + enable + 12 + + true + 1701;1702;1591;1573 + + + R3Extensions.MonoGame + rx + MonoGame Provider and Methods for R3. + + + + + + + + + All + + + + + + + From bd7b812cce42f44ee9c96822489fd043d21b362f Mon Sep 17 00:00:00 2001 From: hadashiA Date: Thu, 15 Feb 2024 18:58:11 +0900 Subject: [PATCH 2/4] Add extensions for MonoGame --- .../MonoGameObservableExtensions.cs | 68 +++++++++++++++++++ src/R3.MonoGame/MonoGameTimeProvider.cs | 9 +-- 2 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 src/R3.MonoGame/MonoGameObservableExtensions.cs diff --git a/src/R3.MonoGame/MonoGameObservableExtensions.cs b/src/R3.MonoGame/MonoGameObservableExtensions.cs new file mode 100644 index 00000000..72f57bb7 --- /dev/null +++ b/src/R3.MonoGame/MonoGameObservableExtensions.cs @@ -0,0 +1,68 @@ +using System; + +namespace R3; + +public static class MonoGameObservableExtensions +{ + public static Observable GameTime(this Observable source) + { + return new GameTimeObservable(source, MonoGameTimeProvider.Update); + } + + 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 index 18102d06..b9a4d083 100644 --- a/src/R3.MonoGame/MonoGameTimeProvider.cs +++ b/src/R3.MonoGame/MonoGameTimeProvider.cs @@ -3,13 +3,14 @@ using System.Threading.Tasks; using R3.Collections; -namespace R3.MonoGame; +namespace R3; public class MonoGameTimeProvider : TimeProvider, IDisposable { public static readonly MonoGameTimeProvider Update = new(); - GameTime gameTime = new(); + public GameTime GameTime { get; private set; } = new(); + FreeListCore list; readonly object gate = new(); @@ -29,7 +30,7 @@ public override ITimer CreateTimer(TimerCallback callback, object? state, TimeSp public override long GetTimestamp() { - return gameTime.TotalGameTime.Ticks; + return GameTime.TotalGameTime.Ticks; } public void Dispose() @@ -45,7 +46,7 @@ public void Tick(GameTime gameTime) { if (!running) return; - this.gameTime = gameTime; + this.GameTime = gameTime; var span = list.AsSpan(); for (var i = 0; i < span.Length; i++) From c30a191b447c0edd5404bb007c747e223c00e749 Mon Sep 17 00:00:00 2001 From: hadashiA Date: Fri, 16 Feb 2024 09:54:39 +0900 Subject: [PATCH 3/4] Fix sample project errors --- sandbox/MonoGameApplication1/Game1.cs | 27 ++++++++++++++----- .../MonoGameApplication1.csproj | 3 +++ .../MonoGameObservableExtensions.cs | 1 + src/R3.MonoGame/MonoGameTimeProvider.cs | 1 + src/R3.MonoGame/ObservableSystemComponent.cs | 3 ++- src/R3.MonoGame/R3.MonoGame.csproj | 5 ++-- 6 files changed, 29 insertions(+), 11 deletions(-) diff --git a/sandbox/MonoGameApplication1/Game1.cs b/sandbox/MonoGameApplication1/Game1.cs index c5943a39..d193845a 100644 --- a/sandbox/MonoGameApplication1/Game1.cs +++ b/sandbox/MonoGameApplication1/Game1.cs @@ -1,19 +1,31 @@ -using Microsoft.Xna.Framework; +using System; +using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; +using R3; namespace MonoGameApplication1; -class HogeComponent : GameComponent +class SampleComponent : GameComponent { - public HogeComponent(Game game) : base(game) + public SampleComponent(Game game) : base(game) { } - public override void Update(GameTime gameTime) + public override void Initialize() { - System.Console.WriteLine($"!!!!! {gameTime.ElapsedGameTime}"); - System.Diagnostics.Trace.WriteLine($"!!!!! {gameTime.ElapsedGameTime}"); + 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()}"); + }); } } @@ -28,7 +40,8 @@ public Game1() Content.RootDirectory = "Content"; IsMouseVisible = true; - Components.Add(new HogeComponent(this)); + Components.Add(new ObservableSystemComponent(this)); + Components.Add(new SampleComponent(this)); } protected override void Initialize() diff --git a/sandbox/MonoGameApplication1/MonoGameApplication1.csproj b/sandbox/MonoGameApplication1/MonoGameApplication1.csproj index 8976cb97..57e285e1 100644 --- a/sandbox/MonoGameApplication1/MonoGameApplication1.csproj +++ b/sandbox/MonoGameApplication1/MonoGameApplication1.csproj @@ -22,6 +22,9 @@ + + + diff --git a/src/R3.MonoGame/MonoGameObservableExtensions.cs b/src/R3.MonoGame/MonoGameObservableExtensions.cs index 72f57bb7..7057529f 100644 --- a/src/R3.MonoGame/MonoGameObservableExtensions.cs +++ b/src/R3.MonoGame/MonoGameObservableExtensions.cs @@ -1,4 +1,5 @@ using System; +using Microsoft.Xna.Framework; namespace R3; diff --git a/src/R3.MonoGame/MonoGameTimeProvider.cs b/src/R3.MonoGame/MonoGameTimeProvider.cs index b9a4d083..9202d1d7 100644 --- a/src/R3.MonoGame/MonoGameTimeProvider.cs +++ b/src/R3.MonoGame/MonoGameTimeProvider.cs @@ -1,6 +1,7 @@ using System; using System.Threading; using System.Threading.Tasks; +using Microsoft.Xna.Framework; using R3.Collections; namespace R3; diff --git a/src/R3.MonoGame/ObservableSystemComponent.cs b/src/R3.MonoGame/ObservableSystemComponent.cs index 1d0f406e..accb58a2 100644 --- a/src/R3.MonoGame/ObservableSystemComponent.cs +++ b/src/R3.MonoGame/ObservableSystemComponent.cs @@ -1,6 +1,7 @@ using System; +using Microsoft.Xna.Framework; -namespace R3.MonoGame; +namespace R3; public class ObservableSystemComponent(Game game, Action exceptionHandler) : GameComponent(game) { diff --git a/src/R3.MonoGame/R3.MonoGame.csproj b/src/R3.MonoGame/R3.MonoGame.csproj index 6ac01d18..0fb427ca 100644 --- a/src/R3.MonoGame/R3.MonoGame.csproj +++ b/src/R3.MonoGame/R3.MonoGame.csproj @@ -1,8 +1,7 @@  - netstandard2.0;netstandard2.1;net6.0;net8.0 - disable + net6.0;net8.0 enable 12 @@ -20,7 +19,7 @@ - + All From 90803795644c4b55b6a05f0b1df9adb94c7e2c1a Mon Sep 17 00:00:00 2001 From: hadashiA Date: Fri, 16 Feb 2024 10:20:23 +0900 Subject: [PATCH 4/4] README --- README.md | 829 +++++++++--------- .../MonoGameObservableExtensions.cs | 6 + 2 files changed, 444 insertions(+), 391 deletions(-) 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/src/R3.MonoGame/MonoGameObservableExtensions.cs b/src/R3.MonoGame/MonoGameObservableExtensions.cs index 7057529f..220e1806 100644 --- a/src/R3.MonoGame/MonoGameObservableExtensions.cs +++ b/src/R3.MonoGame/MonoGameObservableExtensions.cs @@ -5,11 +5,17 @@ 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);