|
@@ -28,36 +28,38 @@ namespace System.Reactive.Linq.ObservableImpl
|
|
|
|
|
|
protected override _ CreateSink(IObserver<TResult> observer) => new _(this, observer);
|
|
|
|
|
|
- protected override void Run(_ sink) => sink.Run();
|
|
|
+ protected override void Run(_ sink) => sink.Run(_scheduler);
|
|
|
|
|
|
internal sealed class _ : IdentitySink<TResult>
|
|
|
{
|
|
|
- // CONSIDER: This sink has a parent reference that can be considered for removal.
|
|
|
-
|
|
|
- private readonly NoTime _parent;
|
|
|
+ readonly Func<TState, bool> _condition;
|
|
|
+ readonly Func<TState, TState> _iterate;
|
|
|
+ readonly Func<TState, TResult> _resultSelector;
|
|
|
|
|
|
public _(NoTime parent, IObserver<TResult> observer)
|
|
|
: base(observer)
|
|
|
{
|
|
|
- _parent = parent;
|
|
|
+ _condition = parent._condition;
|
|
|
+ _iterate = parent._iterate;
|
|
|
+ _resultSelector = parent._resultSelector;
|
|
|
+
|
|
|
+ _state = parent._initialState;
|
|
|
+ _first = true;
|
|
|
}
|
|
|
|
|
|
private TState _state;
|
|
|
private bool _first;
|
|
|
|
|
|
- public void Run()
|
|
|
+ public void Run(IScheduler _scheduler)
|
|
|
{
|
|
|
- _state = _parent._initialState;
|
|
|
- _first = true;
|
|
|
-
|
|
|
- var longRunning = _parent._scheduler.AsLongRunning();
|
|
|
+ var longRunning = _scheduler.AsLongRunning();
|
|
|
if (longRunning != null)
|
|
|
{
|
|
|
SetUpstream(longRunning.ScheduleLongRunning(this, (@this, c) => @this.Loop(c)));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- SetUpstream(_parent._scheduler.Schedule(this, (@this, a) => @this.LoopRec(a)));
|
|
|
+ SetUpstream(_scheduler.Schedule(this, (@this, a) => @this.LoopRec(a)));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -75,14 +77,14 @@ namespace System.Reactive.Linq.ObservableImpl
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- _state = _parent._iterate(_state);
|
|
|
+ _state = _iterate(_state);
|
|
|
}
|
|
|
|
|
|
- hasResult = _parent._condition(_state);
|
|
|
+ hasResult = _condition(_state);
|
|
|
|
|
|
if (hasResult)
|
|
|
{
|
|
|
- result = _parent._resultSelector(_state);
|
|
|
+ result = _resultSelector(_state);
|
|
|
}
|
|
|
}
|
|
|
catch (Exception exception)
|
|
@@ -119,14 +121,14 @@ namespace System.Reactive.Linq.ObservableImpl
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- _state = _parent._iterate(_state);
|
|
|
+ _state = _iterate(_state);
|
|
|
}
|
|
|
|
|
|
- hasResult = _parent._condition(_state);
|
|
|
+ hasResult = _condition(_state);
|
|
|
|
|
|
if (hasResult)
|
|
|
{
|
|
|
- result = _parent._resultSelector(_state);
|
|
|
+ result = _resultSelector(_state);
|
|
|
}
|
|
|
}
|
|
|
catch (Exception exception)
|
|
@@ -169,31 +171,34 @@ namespace System.Reactive.Linq.ObservableImpl
|
|
|
|
|
|
protected override _ CreateSink(IObserver<TResult> observer) => new _(this, observer);
|
|
|
|
|
|
- protected override void Run(_ sink) => sink.Run();
|
|
|
+ protected override void Run(_ sink) => sink.Run(_scheduler, _initialState);
|
|
|
|
|
|
internal sealed class _ : IdentitySink<TResult>
|
|
|
{
|
|
|
- // CONSIDER: This sink has a parent reference that can be considered for removal.
|
|
|
-
|
|
|
- private readonly Absolute _parent;
|
|
|
+ readonly Func<TState, bool> _condition;
|
|
|
+ readonly Func<TState, TState> _iterate;
|
|
|
+ readonly Func<TState, TResult> _resultSelector;
|
|
|
+ readonly Func<TState, DateTimeOffset> _timeSelector;
|
|
|
|
|
|
public _(Absolute parent, IObserver<TResult> observer)
|
|
|
: base(observer)
|
|
|
{
|
|
|
- _parent = parent;
|
|
|
+ _condition = parent._condition;
|
|
|
+ _iterate = parent._iterate;
|
|
|
+ _resultSelector = parent._resultSelector;
|
|
|
+ _timeSelector = parent._timeSelector;
|
|
|
+
|
|
|
+ _first = true;
|
|
|
}
|
|
|
|
|
|
private bool _first;
|
|
|
private bool _hasResult;
|
|
|
+
|
|
|
private TResult _result;
|
|
|
|
|
|
- public void Run()
|
|
|
+ public void Run(IScheduler outerScheduler, TState initialState)
|
|
|
{
|
|
|
- _first = true;
|
|
|
- _hasResult = false;
|
|
|
- _result = default(TResult);
|
|
|
-
|
|
|
- SetUpstream(_parent._scheduler.Schedule((@this: this, _parent._initialState), (scheduler, tuple) => [email protected](scheduler, tuple._initialState)));
|
|
|
+ SetUpstream(outerScheduler.Schedule((@this: this, initialState), (scheduler, tuple) => [email protected](scheduler, tuple.initialState)));
|
|
|
}
|
|
|
|
|
|
private IDisposable InvokeRec(IScheduler self, TState state)
|
|
@@ -213,15 +218,15 @@ namespace System.Reactive.Linq.ObservableImpl
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- state = _parent._iterate(state);
|
|
|
+ state = _iterate(state);
|
|
|
}
|
|
|
|
|
|
- _hasResult = _parent._condition(state);
|
|
|
+ _hasResult = _condition(state);
|
|
|
|
|
|
if (_hasResult)
|
|
|
{
|
|
|
- _result = _parent._resultSelector(state);
|
|
|
- time = _parent._timeSelector(state);
|
|
|
+ _result = _resultSelector(state);
|
|
|
+ time = _timeSelector(state);
|
|
|
}
|
|
|
}
|
|
|
catch (Exception exception)
|
|
@@ -262,31 +267,33 @@ namespace System.Reactive.Linq.ObservableImpl
|
|
|
|
|
|
protected override _ CreateSink(IObserver<TResult> observer) => new _(this, observer);
|
|
|
|
|
|
- protected override void Run(_ sink) => sink.Run();
|
|
|
+ protected override void Run(_ sink) => sink.Run(_scheduler, _initialState);
|
|
|
|
|
|
internal sealed class _ : IdentitySink<TResult>
|
|
|
{
|
|
|
- // CONSIDER: This sink has a parent reference that can be considered for removal.
|
|
|
-
|
|
|
- private readonly Relative _parent;
|
|
|
+ private readonly Func<TState, bool> _condition;
|
|
|
+ private readonly Func<TState, TState> _iterate;
|
|
|
+ private readonly Func<TState, TResult> _resultSelector;
|
|
|
+ private readonly Func<TState, TimeSpan> _timeSelector;
|
|
|
|
|
|
public _(Relative parent, IObserver<TResult> observer)
|
|
|
: base(observer)
|
|
|
{
|
|
|
- _parent = parent;
|
|
|
+ _condition = parent._condition;
|
|
|
+ _iterate = parent._iterate;
|
|
|
+ _resultSelector = parent._resultSelector;
|
|
|
+ _timeSelector = parent._timeSelector;
|
|
|
+
|
|
|
+ _first = true;
|
|
|
}
|
|
|
|
|
|
private bool _first;
|
|
|
private bool _hasResult;
|
|
|
private TResult _result;
|
|
|
|
|
|
- public void Run()
|
|
|
+ public void Run(IScheduler outerScheduler, TState initialState)
|
|
|
{
|
|
|
- _first = true;
|
|
|
- _hasResult = false;
|
|
|
- _result = default(TResult);
|
|
|
-
|
|
|
- SetUpstream(_parent._scheduler.Schedule((@this: this, _parent._initialState), (scheduler, tuple) => [email protected](scheduler, tuple._initialState)));
|
|
|
+ SetUpstream(outerScheduler.Schedule((@this: this, initialState), (scheduler, tuple) => [email protected](scheduler, tuple.initialState)));
|
|
|
}
|
|
|
|
|
|
private IDisposable InvokeRec(IScheduler self, TState state)
|
|
@@ -306,15 +313,15 @@ namespace System.Reactive.Linq.ObservableImpl
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- state = _parent._iterate(state);
|
|
|
+ state = _iterate(state);
|
|
|
}
|
|
|
|
|
|
- _hasResult = _parent._condition(state);
|
|
|
+ _hasResult = _condition(state);
|
|
|
|
|
|
if (_hasResult)
|
|
|
{
|
|
|
- _result = _parent._resultSelector(state);
|
|
|
- time = _parent._timeSelector(state);
|
|
|
+ _result = _resultSelector(state);
|
|
|
+ time = _timeSelector(state);
|
|
|
}
|
|
|
}
|
|
|
catch (Exception exception)
|