require_relative '../../spec_helper'

ruby_version_is "2.7" do
  describe "Enumerator.produce" do
    it "creates an infinite enumerator" do
      enum = Enumerator.produce(0) { |prev| prev + 1 }
      enum.take(5).should == [0, 1, 2, 3, 4]
    end

    it "terminates iteration when block raises StopIteration exception" do
      enum = Enumerator.produce(0) do | prev|
        raise StopIteration if prev >= 2
        prev + 1
      end

      enum.to_a.should == [0, 1, 2]
    end

    context "when initial value skipped" do
      it "uses nil instead" do
        ScratchPad.record []
        enum = Enumerator.produce { |prev| ScratchPad << prev; (prev || 0) + 1 }

        enum.take(3).should == [1, 2, 3]
        ScratchPad.recorded.should == [nil, 1, 2]
      end

      it "starts enumerable from result of first block call" do
        io = StringIO.new("a\nb\nc\nd")
        lines = Enumerator.produce { io.gets }.take_while { |s| s }

        lines.should == ["a\n", "b\n", "c\n", "d"]
      end
    end
  end
end

Add new specs. Added Enumerator.produce to generate an Enumerator from any custom data transformation
Add new specs. Added Enumerator.produce to generate an Enumerator from any custom data transformation
