public static AsyncObserverExpression <TSource> Then([NotNull] AsyncObserverExpression <TSource> left, [NotNull] AsyncObserverExpression <TSource> right)
        {
            if (left == null)
            {
                throw new ArgumentNullException("left");
            }
            if (right == null)
            {
                throw new ArgumentNullException("right");
            }

            if (left.m_handler != null)
            {
                var f = left.m_handler;
                if (right.m_handler != null)
                {
                    var g = right.m_handler;
                    return(new AsyncObserverExpression <TSource>((x) => { f(x); g(x); }));
                }
                else
                {
                    var g = right.m_asyncHandler;
                    return(new AsyncObserverExpression <TSource>((x, ct) => { f(x); return g(x, ct); }));
                }
            }
            else
            {
                var f = left.m_asyncHandler;
                if (right.m_asyncHandler != null)
                {
                    var g = right.m_asyncHandler;
                    return(new AsyncObserverExpression <TSource>(async(x, ct) => { await f(x, ct).ConfigureAwait(false); await g(x, ct).ConfigureAwait(false); }));
                }
                else
                {
                    var g = right.m_handler;
                    return(new AsyncObserverExpression <TSource>(async(x, ct) => { await f(x, ct).ConfigureAwait(false); g(x); }));
                }
            }
        }
 public FdbObserverIterator(IFdbAsyncEnumerable <TSource> source, AsyncObserverExpression <TSource> observer)
     : base(source)
 {
     Contract.Requires(observer != null);
     m_observer = observer;
 }
 public AsyncObserverExpression <TSource> Then([NotNull] AsyncObserverExpression <TSource> expr)
 {
     return(Then(this, expr));
 }