internal Enumerator(ImmutableTrieListBase <T> list, int startIndex = -1, int count = -1, bool reversed = false)
            {
                Requires.NotNull(list, nameof(list));
                Requires.Range(startIndex >= -1, nameof(startIndex));
                Requires.Range(count >= -1, nameof(count));
                Requires.Argument(reversed || count == -1 || (startIndex == -1 ? 0 : startIndex) + count <= list.Count, nameof(count), "The specified {0} and {1} do not produce a enumerable range.", nameof(startIndex), nameof(count));
                Requires.Argument(!reversed || count == -1 || (startIndex == -1 ? list.Count - 1 : startIndex) - count + 1 >= 0, nameof(count), "The specified {0} and {1} do not produce a enumerable range.", nameof(startIndex), nameof(count));

                _list = list;
                _enumeratingBuilderVersion = GetCurrentVersion(list);

                count       = count == -1 ? list.Count : count;
                _startIndex = startIndex >= 0 ? startIndex : (reversed ? list.Count - 1 : 0);
                _endIndex   = reversed ? _startIndex - count + 1 : _startIndex + count - 1;

                _runningIndex = reversed ? _startIndex + 1 : _startIndex - 1;

                _reversed = reversed;
                _disposed = false;
            }
 private static int GetCurrentVersion(ImmutableTrieListBase <T> list) =>
 (list is Builder builder) ? builder.Version : -1;