|
@@ -4,129 +4,136 @@
|
|
|
|
|
|
namespace System.Reactive.Linq.ObservableImpl
|
|
|
{
|
|
|
- internal sealed class Where<TSource> : Producer<TSource>
|
|
|
+ internal static class Where<TSource>
|
|
|
{
|
|
|
- private readonly IObservable<TSource> _source;
|
|
|
- private readonly Func<TSource, bool> _predicate;
|
|
|
- private readonly Func<TSource, int, bool> _predicateI;
|
|
|
-
|
|
|
- public Where(IObservable<TSource> source, Func<TSource, bool> predicate)
|
|
|
- {
|
|
|
- _source = source;
|
|
|
- _predicate = predicate;
|
|
|
- }
|
|
|
-
|
|
|
- public Where(IObservable<TSource> source, Func<TSource, int, bool> predicate)
|
|
|
+ internal sealed class Predicate : Producer<TSource>
|
|
|
{
|
|
|
- _source = source;
|
|
|
- _predicateI = predicate;
|
|
|
- }
|
|
|
+ private readonly IObservable<TSource> _source;
|
|
|
+ private readonly Func<TSource, bool> _predicate;
|
|
|
|
|
|
- public IObservable<TSource> Combine(Func<TSource, bool> predicate)
|
|
|
- {
|
|
|
- if (_predicate != null)
|
|
|
- return new Where<TSource>(_source, x => _predicate(x) && predicate(x));
|
|
|
- else
|
|
|
- return new Where<TSource>(this, predicate);
|
|
|
- }
|
|
|
+ public Predicate(IObservable<TSource> source, Func<TSource, bool> predicate)
|
|
|
+ {
|
|
|
+ _source = source;
|
|
|
+ _predicate = predicate;
|
|
|
+ }
|
|
|
|
|
|
- protected override IDisposable Run(IObserver<TSource> observer, IDisposable cancel, Action<IDisposable> setSink)
|
|
|
- {
|
|
|
- if (_predicate != null)
|
|
|
+ public IObservable<TSource> Combine(Func<TSource, bool> predicate)
|
|
|
{
|
|
|
- var sink = new _(this, observer, cancel);
|
|
|
- setSink(sink);
|
|
|
- return _source.SubscribeSafe(sink);
|
|
|
+ return new Predicate(_source, x => _predicate(x) && predicate(x));
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ protected override IDisposable Run(IObserver<TSource> observer, IDisposable cancel, Action<IDisposable> setSink)
|
|
|
{
|
|
|
- var sink = new WhereImpl(this, observer, cancel);
|
|
|
+ var sink = new _(_predicate, observer, cancel);
|
|
|
setSink(sink);
|
|
|
return _source.SubscribeSafe(sink);
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- class _ : Sink<TSource>, IObserver<TSource>
|
|
|
- {
|
|
|
- private readonly Where<TSource> _parent;
|
|
|
|
|
|
- public _(Where<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
|
|
|
- : base(observer, cancel)
|
|
|
+ private sealed class _ : Sink<TSource>, IObserver<TSource>
|
|
|
{
|
|
|
- _parent = parent;
|
|
|
- }
|
|
|
+ private readonly Func<TSource, bool> _predicate;
|
|
|
|
|
|
- public void OnNext(TSource value)
|
|
|
- {
|
|
|
- var shouldRun = default(bool);
|
|
|
- try
|
|
|
+ public _(Func<TSource, bool> predicate, IObserver<TSource> observer, IDisposable cancel)
|
|
|
+ : base(observer, cancel)
|
|
|
{
|
|
|
- shouldRun = _parent._predicate(value);
|
|
|
+ _predicate = predicate;
|
|
|
}
|
|
|
- catch (Exception exception)
|
|
|
+
|
|
|
+ public void OnNext(TSource value)
|
|
|
+ {
|
|
|
+ var shouldRun = default(bool);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ shouldRun = _predicate(value);
|
|
|
+ }
|
|
|
+ catch (Exception exception)
|
|
|
+ {
|
|
|
+ base._observer.OnError(exception);
|
|
|
+ base.Dispose();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shouldRun)
|
|
|
+ {
|
|
|
+ base._observer.OnNext(value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void OnError(Exception error)
|
|
|
{
|
|
|
- base._observer.OnError(exception);
|
|
|
+ base._observer.OnError(error);
|
|
|
base.Dispose();
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
- if (shouldRun)
|
|
|
- base._observer.OnNext(value);
|
|
|
+ public void OnCompleted()
|
|
|
+ {
|
|
|
+ base._observer.OnCompleted();
|
|
|
+ base.Dispose();
|
|
|
+ }
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- public void OnError(Exception error)
|
|
|
- {
|
|
|
- base._observer.OnError(error);
|
|
|
- base.Dispose();
|
|
|
- }
|
|
|
+ internal sealed class PredicateIndexed : Producer<TSource>
|
|
|
+ {
|
|
|
+ private readonly IObservable<TSource> _source;
|
|
|
+ private readonly Func<TSource, int, bool> _predicate;
|
|
|
|
|
|
- public void OnCompleted()
|
|
|
+ public PredicateIndexed(IObservable<TSource> source, Func<TSource, int, bool> predicate)
|
|
|
{
|
|
|
- base._observer.OnCompleted();
|
|
|
- base.Dispose();
|
|
|
+ _source = source;
|
|
|
+ _predicate = predicate;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- class WhereImpl : Sink<TSource>, IObserver<TSource>
|
|
|
- {
|
|
|
- private readonly Where<TSource> _parent;
|
|
|
- private int _index;
|
|
|
-
|
|
|
- public WhereImpl(Where<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
|
|
|
- : base(observer, cancel)
|
|
|
+ protected override IDisposable Run(IObserver<TSource> observer, IDisposable cancel, Action<IDisposable> setSink)
|
|
|
{
|
|
|
- _parent = parent;
|
|
|
- _index = 0;
|
|
|
+ var sink = new _(_predicate, observer, cancel);
|
|
|
+ setSink(sink);
|
|
|
+ return _source.SubscribeSafe(sink);
|
|
|
}
|
|
|
|
|
|
- public void OnNext(TSource value)
|
|
|
+ private sealed class _ : Sink<TSource>, IObserver<TSource>
|
|
|
{
|
|
|
- var shouldRun = default(bool);
|
|
|
- try
|
|
|
+ private readonly Func<TSource, int, bool> _predicate;
|
|
|
+ private int _index;
|
|
|
+
|
|
|
+ public _(Func<TSource, int, bool> predicate, IObserver<TSource> observer, IDisposable cancel)
|
|
|
+ : base(observer, cancel)
|
|
|
+ {
|
|
|
+ _predicate = predicate;
|
|
|
+ _index = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void OnNext(TSource value)
|
|
|
{
|
|
|
- shouldRun = _parent._predicateI(value, checked(_index++));
|
|
|
+ var shouldRun = default(bool);
|
|
|
+ try
|
|
|
+ {
|
|
|
+ shouldRun = _predicate(value, checked(_index++));
|
|
|
+ }
|
|
|
+ catch (Exception exception)
|
|
|
+ {
|
|
|
+ base._observer.OnError(exception);
|
|
|
+ base.Dispose();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shouldRun)
|
|
|
+ {
|
|
|
+ base._observer.OnNext(value);
|
|
|
+ }
|
|
|
}
|
|
|
- catch (Exception exception)
|
|
|
+
|
|
|
+ public void OnError(Exception error)
|
|
|
{
|
|
|
- base._observer.OnError(exception);
|
|
|
+ base._observer.OnError(error);
|
|
|
base.Dispose();
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
- if (shouldRun)
|
|
|
- base._observer.OnNext(value);
|
|
|
- }
|
|
|
-
|
|
|
- public void OnError(Exception error)
|
|
|
- {
|
|
|
- base._observer.OnError(error);
|
|
|
- base.Dispose();
|
|
|
- }
|
|
|
-
|
|
|
- public void OnCompleted()
|
|
|
- {
|
|
|
- base._observer.OnCompleted();
|
|
|
- base.Dispose();
|
|
|
+ public void OnCompleted()
|
|
|
+ {
|
|
|
+ base._observer.OnCompleted();
|
|
|
+ base.Dispose();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|