79 lines
1.9 KiB
C#
79 lines
1.9 KiB
C#
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
|
|
|
|
#if NO_CDS || NO_PERF
|
|
using System.Collections.Generic;
|
|
|
|
namespace System.Reactive
|
|
{
|
|
sealed class PushPullAdapter<T, R> : IObserver<T>, IEnumerator<R>
|
|
{
|
|
Action<Notification<T>> yield;
|
|
Action dispose;
|
|
Func<Notification<R>> moveNext;
|
|
Notification<R> current;
|
|
bool done = false;
|
|
bool disposed;
|
|
|
|
public PushPullAdapter(Action<Notification<T>> yield, Func<Notification<R>> moveNext, Action dispose)
|
|
{
|
|
this.yield = yield;
|
|
this.moveNext = moveNext;
|
|
this.dispose = dispose;
|
|
}
|
|
|
|
public void OnNext(T value)
|
|
{
|
|
yield(Notification.CreateOnNext<T>(value));
|
|
}
|
|
|
|
public void OnError(Exception exception)
|
|
{
|
|
yield(Notification.CreateOnError<T>(exception));
|
|
dispose();
|
|
}
|
|
|
|
public void OnCompleted()
|
|
{
|
|
yield(Notification.CreateOnCompleted<T>());
|
|
dispose();
|
|
}
|
|
|
|
public R Current
|
|
{
|
|
get { return current.Value; }
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
disposed = true;
|
|
dispose();
|
|
}
|
|
|
|
object System.Collections.IEnumerator.Current
|
|
{
|
|
get { return this.Current; }
|
|
}
|
|
|
|
public bool MoveNext()
|
|
{
|
|
if (disposed)
|
|
throw new ObjectDisposedException("");
|
|
|
|
if (!done)
|
|
{
|
|
current = moveNext();
|
|
done = current.Kind != NotificationKind.OnNext;
|
|
}
|
|
|
|
current.Exception.ThrowIfNotNull();
|
|
|
|
return current.HasValue;
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
throw new NotSupportedException();
|
|
}
|
|
}
|
|
}
|
|
#endif |