Skip to content

Commit 9208aeb

Browse files
Lillian ZhangNicolas Laurent
authored andcommitted
Implement Range#{count, size, first, max, min} for beginless ranges
and internal beginless? predicate
1 parent 8c67f4a commit 9208aeb

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

src/main/ruby/truffleruby/core/range.rb

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def bsearch(&block)
9999
end
100100

101101
private def bsearch_float(&block)
102-
normalized_begin = Primitive.nil?(self.begin) ? -Float::INFINITY : self.begin.to_f
102+
normalized_begin = Truffle::RangeOperations.beginless?(self) ? -Float::INFINITY : self.begin.to_f
103103
normalized_end = Truffle::RangeOperations.endless?(self) ? Float::INFINITY : self.end.to_f
104104
normalized_end = normalized_end.prev_float if self.exclude_end?
105105
min = normalized_begin
@@ -262,6 +262,16 @@ def bsearch(&block)
262262
last_admissible
263263
end
264264

265+
def count(item = undefined)
266+
if Truffle::RangeOperations.beginless?(self) || Truffle::RangeOperations.endless?(self)
267+
return Float::INFINITY unless block_given? || !Primitive.undefined?(item)
268+
end
269+
270+
p "count for here"
271+
272+
super
273+
end
274+
265275
private def each_internal(&block)
266276
return to_enum { size } unless block_given?
267277
first, last = self.begin, self.end
@@ -325,6 +335,7 @@ def bsearch(&block)
325335
end
326336

327337
def first(n=undefined)
338+
raise RangeError, 'cannot get the first element of beginless range' if Primitive.nil?(self.begin)
328339
return self.begin if Primitive.undefined? n
329340

330341
super
@@ -383,6 +394,10 @@ def last(n=undefined)
383394

384395
def max
385396
raise RangeError, 'cannot get the maximum of endless range' if Truffle::RangeOperations.endless?(self)
397+
if Truffle::RangeOperations.beginless?(self)
398+
raise RangeError, 'cannot get the maximum of beginless range with custom comparison method' if block_given?
399+
return exclude_end? ? self.end - 1 : self.end
400+
end
386401
return super if block_given? || (exclude_end? && !self.end.kind_of?(Numeric))
387402
return nil if Comparable.compare_int(self.end <=> self.begin) < 0
388403
return nil if exclude_end? && Comparable.compare_int(self.end <=> self.begin) == 0
@@ -400,8 +415,13 @@ def max
400415
end
401416

402417
def min
418+
raise RangeError, 'cannot get the minimum of beginless range' if Truffle::RangeOperations.beginless?(self)
419+
if Truffle::RangeOperations.endless?(self)
420+
raise RangeError, 'cannot get the minimum of endless range with custom comparison method' if block_given?
421+
return self.begin
422+
end
403423
return super if block_given?
404-
if !Truffle::RangeOperations.endless?(self) && Comparable.compare_int(self.end <=> self.begin) < 0
424+
if Comparable.compare_int(self.end <=> self.begin) < 0
405425
return nil
406426
elsif exclude_end? && self.end == self.begin
407427
return nil
@@ -499,6 +519,7 @@ def cover?(value)
499519
end
500520

501521
def size
522+
return Float::INFINITY if Truffle::RangeOperations.beginless?(self)
502523
return nil unless self.begin.kind_of?(Numeric)
503524
return Float::INFINITY if Truffle::RangeOperations.endless?(self)
504525

src/main/ruby/truffleruby/core/truffle/range_operations.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ def self.cover?(range, value)
126126
false
127127
end
128128

129+
def self.beginless?(range)
130+
Primitive.nil? range.begin
131+
end
132+
129133
def self.endless?(range)
130134
Primitive.nil? range.end
131135
end

0 commit comments

Comments
 (0)