Skip to content

Commit

Permalink
[GR-19220] Implement Enumerator#produce (#2160)
Browse files Browse the repository at this point in the history
PullRequest: truffleruby/2166
  • Loading branch information
eregon committed Nov 17, 2020
2 parents 001f1dc + 47db835 commit 4e928a9
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 4 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Compatibility:
* Implement `Enumerable#tally` and `Enumerable#filter_map` (#2144 and #2152, @LillianZ).
* Implement `Range#minmax`.
* Pass more `Enumerator::Lazy#uniq` and `Enumerator::Lazy#chunk` specs (#2146, @LillianZ).
* Implement `Enumerator#produce` (#2160, @zverok)

Performance:

Expand Down
4 changes: 0 additions & 4 deletions spec/tags/core/enumerator/produce_tags.txt

This file was deleted.

13 changes: 13 additions & 0 deletions src/main/ruby/truffleruby/core/enumerator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,19 @@ def +(other)
Enumerator::Chain.new(self, other)
end

def self.produce(initial = nil)
# Taken from https://github.com/zverok/enumerator_generate
raise ArgumentError, 'No block given' unless block_given?
Enumerator.new(Float::INFINITY) do |y|
val = initial == nil ? yield() : initial

loop do
y << val
val = yield(val)
end
end
end

class Yielder
def initialize(&block)
raise LocalJumpError, 'Expected a block to be given' unless block_given?
Expand Down

0 comments on commit 4e928a9

Please sign in to comment.