private void JoinNodesAtIndex(int index)
        {
            ExtentListNode node     = list.ValueAt(index);
            ExtentListNode?prevNode = null;
            ExtentListNode?nextNode = null;

            if (index - 1 >= 0)
            {
                prevNode = list.ValueAt(index - 1);
            }
            if (index + 1 < list.Count)
            {
                nextNode = list.ValueAt(index + 1);
            }

            //if any node is length 0, remove it
            if (prevNode != null && prevNode.Value.Length == 0)
            {
                Remove(prevNode.Value);
                return;
            }
            if (nextNode != null && nextNode.Value.Length == 0)
            {
                Remove(nextNode.Value);
                return;
            }

            //see if we can join all three nodes together
            if (prevNode != null && nextNode != null &&
                node.Member == prevNode.Value.Member && node.Member == nextNode.Value.Member)
            {
                int totalSize = prevNode.Value.Length + node.Length + nextNode.Value.Length;
                //if any node is a file-backed node
                list.RemoveRangeAt(index - 1, 3);
                Add(prevNode.Value.Start, totalSize, node.Member);
                return;
            }

            //see if we can join previous node to middle node
            if (prevNode != null && node.Member == prevNode.Value.Member)
            {
                int totalSize = prevNode.Value.Length + node.Length;
                list.RemoveRangeAt(index - 1, 2);
                Add(prevNode.Value.Start, totalSize, prevNode.Value.Member);
                return;
            }

            //see if we can join next node to middle node
            if (nextNode != null && node.Member == nextNode.Value.Member)
            {
                int totalSize = node.Length + nextNode.Value.Length;
                list.RemoveRangeAt(index, 2);
                Add(node.Start, totalSize, node.Member);
                return;
            }
        }
 private void Remove(ExtentListNode node)
 {
     list.Remove(node.Start);
 }