public ObservableCursorSubscription(ObservableCursor <T> cursor, int index, int take, IObserver <T> observer)
            {
                Contract.Requires(cursor != null);
                Contract.Requires(index >= 0);
                Contract.Requires(take == subscribeUnlimited || take > 0);
                Contract.Requires(observer != null);

                this.cursor   = cursor;
                this.index    = index;
                this.take     = take;
                this.observer = observer;

                Contract.Assume(cursor.subscriptions != null);

                cursor.subscriptions.Add(this);
            }
            public ObservableCursorBranch(ObservableCursor <T> cursor, int currentIndex, CompositeDisposable parentDisposables)
            {
                Contract.Requires(cursor != null);
                Contract.Requires(cursor.branches != null);
                Contract.Requires(cursor.elements != null);
                Contract.Requires(cursor.latestIndex >= -1);
                Contract.Requires(currentIndex >= 0);
                Contract.Requires(currentIndex >= cursor.firstElementIndex);
                Contract.Requires(currentIndex > cursor.latestIndex || cursor.elements.Count >= cursor.latestIndex - currentIndex);
                Contract.Requires(!cursor.stopped || currentIndex <= cursor.latestIndex + 1);
                Contract.Requires(parentDisposables != null);
                Contract.Ensures(this.cursor == cursor);
                Contract.Ensures(this.currentIndex == currentIndex);
                Contract.Ensures(!IsSynchronized);
                Contract.Ensures(IsForwardOnly == cursor.IsForwardOnly);
                Contract.Ensures(IsSequenceTerminated == cursor.IsSequenceTerminated);
                Contract.Ensures(LatestIndex == cursor.latestIndex);
                Contract.Ensures(CurrentIndex == currentIndex);
                Contract.Ensures(AtEndOfSequence == (cursor.IsSequenceTerminated && currentIndex == cursor.latestIndex + 1));

                this.cursor       = cursor;
                this.currentIndex = currentIndex;

                parentDisposables.Add(this);
                cursor.branches.Add(this);

                bool removed = false;

                var subscription = Disposable.Create(() =>
                {
                    if (!removed)
                    {
                        // Set this variable first in case of reentry.
                        removed = true;

                        parentDisposables.Remove(this);
                        cursor.branches.Remove(this);
                    }
                });

                disposables.Add(subscription);

                Contract.Assert(currentIndex > cursor.latestIndex || cursor.elements.Count >= cursor.latestIndex - currentIndex);
            }