Skip to content

Commit

Permalink
Defer
Browse files Browse the repository at this point in the history
  • Loading branch information
neuecc committed Dec 23, 2023
1 parent 9a685d1 commit ede36e5
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 11 deletions.
2 changes: 1 addition & 1 deletion sandbox/ConsoleApp1/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@

var range = System.Reactive.Linq.Observable.Range(1, 10);


System.Reactive.Linq.Observable.Defer(

Check failure on line 33 in sandbox/ConsoleApp1/Program.cs

View workflow job for this annotation

GitHub Actions / build-dotnet

; expected

// range.TakeLast(

Expand Down
29 changes: 29 additions & 0 deletions src/R3/Factories/Defer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
namespace R3;

public static partial class Observable
{
public static Observable<T> Defer<T>(Func<Observable<T>> observableFactory)
{
return new Defer<T>(observableFactory);
}
}


internal sealed class Defer<T>(Func<Observable<T>> observableFactory) : Observable<T>
{
protected override IDisposable SubscribeCore(Observer<T> observer)
{
var observable = default(Observable<T>);
try
{
observable = observableFactory();
}
catch (Exception ex)
{
observer.OnCompleted(ex); // when failed, return Completed(Error)
return Disposable.Empty;
}

return observable.Subscribe(observer);
}
}
25 changes: 24 additions & 1 deletion src/R3/Factories/ReturnOnCompleted.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,14 @@ public static partial class Observable
{
public static Observable<T> ReturnOnCompleted<T>(Result result)
{
return new ImmediateScheduleReturnOnCompleted<T>(result); // immediate
if (result.IsSuccess)
{
return ImmediateScheduleReturnOnCompletedSuccess<T>.Instance; // singleton
}
else
{
return new ImmediateScheduleReturnOnCompleted<T>(result); // immediate
}
}

public static Observable<T> ReturnOnCompleted<T>(Result result, TimeProvider timeProvider)
Expand All @@ -26,6 +33,22 @@ public static Observable<T> ReturnOnCompleted<T>(Result result, TimeSpan dueTime
}
}

internal class ImmediateScheduleReturnOnCompletedSuccess<T> : Observable<T>
{
public static readonly Observable<T> Instance = new ImmediateScheduleReturnOnCompletedSuccess<T>();

ImmediateScheduleReturnOnCompletedSuccess()
{

}

protected override IDisposable SubscribeCore(Observer<T> observer)
{
observer.OnCompleted(Result.Success);
return Disposable.Empty;
}
}

internal class ImmediateScheduleReturnOnCompleted<T>(Result result) : Observable<T>
{
protected override IDisposable SubscribeCore(Observer<T> observer)
Expand Down
2 changes: 2 additions & 0 deletions src/R3/Factories/ToObservable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

public static partial class Observable
{
// TODO: not tested.

public static Observable<T> ToObservable<T>(this Task<T> task)
{
return new TaskToObservable<T>(task);
Expand Down
11 changes: 2 additions & 9 deletions src/R3/Factories/_EventFactory.cs
Original file line number Diff line number Diff line change
@@ -1,23 +1,16 @@
using R3.Internal;

namespace R3;
namespace R3;

public static partial class Observable
{
// TODO: this is working space, will remove this file after complete.

// TODO: Defer, DeferAsync, Start, Using, Create
// ToObservable(ToEvent)



// ToObservable(ToEvent)
// ToAsyncEnumerable?

// AsObservable
// AsSingleUnitObservable

// AsUnitObservable
// AsUniResult
// AsNeverComplete
}

23 changes: 23 additions & 0 deletions tests/R3.Tests/FactoryTests/DeferTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
namespace R3.Tests.FactoryTests;

public class DeferTest
{
[Fact]
public void Test()
{
var called = false;
var def = Observable.Defer(() =>
{
called = true;
return Observable.Range(1, 10);
});

called.Should().BeFalse();

var list = def.ToLiveList();

called.Should().BeTrue();

list.AssertEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
}
}

0 comments on commit ede36e5

Please sign in to comment.