diff --git a/lib/net/imap/sequence_set.rb b/lib/net/imap/sequence_set.rb index 827d331fe..28a51fc9c 100644 --- a/lib/net/imap/sequence_set.rb +++ b/lib/net/imap/sequence_set.rb @@ -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 @@ -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: @@ -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 @@ -2414,8 +2421,8 @@ 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) @@ -2423,7 +2430,7 @@ def slice_range(range) 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