Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 15 additions & 8 deletions lib/net/imap/sequence_set.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1720,7 +1720,7 @@ def find_ordered_index(number)
#
# Related: #[], #slice, #ordered_at
def at(index)
seek_number_in_minmaxes(minmaxes, index)
export_num sorted_set_num_at Integer index.to_int
end

# :call-seq: ordered_at(index) -> integer or nil
Expand All @@ -1733,7 +1733,7 @@ def at(index)
#
# Related: #[], #slice, #ordered_at
def ordered_at(index)
seek_number_in_minmaxes(each_entry_minmax, index)
export_num ordered_list_num_at Integer index.to_int
end

# :call-seq:
Expand Down Expand Up @@ -2377,15 +2377,22 @@ def bsearch_range(num) = (min, max = bsearch_minmax(num)) && (min..max)
######################################################################{{{2
# Number indexing methods

def sorted_set_num_at(index)
seek_number_in_minmaxes(minmaxes, index)
end

def ordered_list_num_at(index)
seek_number_in_minmaxes(each_entry_minmax, index)
end

def seek_number_in_minmaxes(minmaxes, index)
index = Integer(index.to_int)
if index.negative?
reverse_each_minmax_with_index(minmaxes) do |min, max, idx_min, idx_max|
idx_min <= index and return export_num(min + (index - idx_min))
idx_min <= index and return min + (index - idx_min)
end
else
each_minmax_with_index(minmaxes) do |min, _, idx_min, idx_max|
index <= idx_max and return export_num(min + (index - idx_min))
index <= idx_max and return min + (index - idx_min)
end
end
nil
Expand Down Expand Up @@ -2414,16 +2421,16 @@ def slice_length(start, length)
start = Integer(start.to_int)
length = Integer(length.to_int)
raise ArgumentError, "length must be positive" unless length.positive?
last = start + length - 1 unless start.negative? && start.abs <= length
slice_range(start..last)
stop = start + length unless start.negative? && start.abs <= length
slice_range(start...stop)
end

def slice_range(range)
first = range.begin || 0
last = range.end || -1
if range.exclude_end?
return remain_frozen_empty if last.zero?
last -= 1 if range.end && last != STAR_INT
last -= 1 if range.end
end
if (first * last).positive? && last < first
remain_frozen_empty
Expand Down
Loading