public IVersionedLinkedListNode <T> GetNext(ulong version, IVersionedLinkedListNode <T> currentNode)
        {
            VersionedLinkedListNode node = (VersionedLinkedListNode)currentNode;

            node = node.Next;
            return(ScanListLookingForNextNodeMatchingVersion(version, node));
        }
        private void Remove(VersionedLinkedListNode nodeToRemove)
        {
            if (_recursionCount != 0)
            {
                throw new InvalidOperationException("You may not do a remove when iterating.  Use MarkForRemove instead.");
            }

            var previousNode = nodeToRemove.Previous;
            var nextNode     = nodeToRemove.Next;

            if (previousNode != null)
            {
                previousNode.Next = nextNode;
            }

            if (nextNode != null)
            {
                nextNode.Previous = previousNode;
            }

            if (nodeToRemove == this.First)
            {
                this.First = nextNode;
            }

            if (nodeToRemove == this.Last)
            {
                this.Last = previousNode;
            }

            nodeToRemove.Next     = null;
            nodeToRemove.Previous = null;
        }
        public void MarkForRemove(IVersionedLinkedListNode <T> nodeToRemove)
        {
            VersionedLinkedListNode node = (VersionedLinkedListNode)nodeToRemove;

            if (_recursionCount == 0)
            {
                Remove(node);
            }
            else
            {
                node.MarkForDelete();
                _toBeRemoved.Push(node);
            }
        }
        public void AddLast(T value)
        {
            this.Version++;

            VersionedLinkedListNode nodeToAdd = new VersionedLinkedListNode(value, this.Version);

            if (this.Last == null)
            {
                this.Last  = nodeToAdd;
                this.First = nodeToAdd;
                return;
            }

            VersionedLinkedListNode previousLast = this.Last;

            previousLast.Next  = nodeToAdd;
            nodeToAdd.Previous = previousLast;

            this.Last = nodeToAdd;
        }
        private static IVersionedLinkedListNode <T> ScanListLookingForNextNodeMatchingVersion(ulong version, VersionedLinkedListNode currentNode)
        {
            while (currentNode != null && currentNode.Version > version)
            {
                currentNode = currentNode.Next;
            }

            return(currentNode);
        }