diff --git a/src/R3/Operators/DebounceFrame.cs b/src/R3/Operators/DebounceFrame.cs index 4bfb56d..98ef907 100644 --- a/src/R3/Operators/DebounceFrame.cs +++ b/src/R3/Operators/DebounceFrame.cs @@ -28,7 +28,7 @@ sealed class _DebounceFrame : Observer, IFrameRunnerWorkItem readonly object gate = new object(); readonly FrameProvider frameProvider; T? latestValue; - bool hasvalue; + bool hasValue; int currentFrame; bool isRunning; @@ -44,7 +44,7 @@ protected override void OnNextCore(T value) lock (gate) { latestValue = value; - hasvalue = true; + hasValue = true; currentFrame = 0; if (!isRunning) @@ -64,10 +64,10 @@ protected override void OnCompletedCore(Result result) { lock (gate) { - if (hasvalue) + if (hasValue) { observer.OnNext(latestValue!); - hasvalue = false; + hasValue = false; latestValue = default; } } @@ -80,15 +80,16 @@ bool IFrameRunnerWorkItem.MoveNext(long _) lock (gate) { - if (hasvalue) + if (hasValue) { if (++currentFrame == frameCount) { - observer.OnNext(latestValue!); - hasvalue = false; + var value = latestValue!; + hasValue = false; latestValue = default; currentFrame = 0; isRunning = false; + observer.OnNext(value); return false; } } diff --git a/src/R3/Operators/ThrottleLastFrame.cs b/src/R3/Operators/ThrottleLastFrame.cs index 7ec9b65..d541bb7 100644 --- a/src/R3/Operators/ThrottleLastFrame.cs +++ b/src/R3/Operators/ThrottleLastFrame.cs @@ -72,9 +72,10 @@ bool IFrameRunnerWorkItem.MoveNext(long _) { if (++currentFrame == frameCount) { - observer.OnNext(lastValue!); + var value = lastValue!; lastValue = default; running = false; + observer.OnNext(value); return false; } } diff --git a/tests/R3.Tests/OperatorTests/DebounceThrottleFirstThrottleLastTest.cs b/tests/R3.Tests/OperatorTests/DebounceThrottleFirstThrottleLastTest.cs index 959f2c5..7df8732 100644 --- a/tests/R3.Tests/OperatorTests/DebounceThrottleFirstThrottleLastTest.cs +++ b/tests/R3.Tests/OperatorTests/DebounceThrottleFirstThrottleLastTest.cs @@ -445,4 +445,44 @@ public void DebounceSelector() list.AssertIsCompleted(); } + + + // + Publish from OnNext + [Fact] + public void DebounceFrameReentry() + { + var frameProvider = new FakeFrameProvider(); + + var publisher = new Subject(); + var list = publisher.DebounceFrame(3, frameProvider).Do(_ => publisher.OnNext(2)).ToLiveList(); + + publisher.OnNext(1); + list.AssertEqual([]); + + frameProvider.Advance(3); + + list.AssertEqual([1]); + + frameProvider.Advance(3); + list.AssertEqual([1, 2]); + } + + [Fact] + public void ThrottleLastFrameReentry() + { + var frameProvider = new FakeFrameProvider(); + + var publisher = new Subject(); + var list = publisher.ThrottleLastFrame(3, frameProvider).Do(_ => publisher.OnNext(2)).ToLiveList(); + + publisher.OnNext(1); + list.AssertEqual([]); + + frameProvider.Advance(3); + + list.AssertEqual([1]); + + frameProvider.Advance(3); + list.AssertEqual([1, 2]); + } }