# -*- coding: utf-8 -*-

# 工夫した点・苦労した点・感想等（ご自由にお書きください）：
# ・
# ・

class AnswerQ1
  def each
    return to_enum unless block_given?
    a, b = 0, 1
    loop do
      yield b
      a, b = b, a + b
    end
  end

  def drop n
    # ここを適切に実装してテストが通るようにしてください。
    # ただし、以下の条件を満たすこと：
    # ・上記の `each` メソッドを必ず利用すること。
    # ・yield 文（yield 式）を必ず利用すること。
    # ・require 文を使用しないこと。
    # 桜先生からのワンポイントアドバイス：
    # ・each メソッドの実装を参考にすれば、そんなに難しくはないはずよ♪
    # ・return to_enum 〜 の行は、each メソッドからのコピペじゃ正常に動かないから、気をつけてね♪
    # ・実装方法はいくつかあるけれど、テストが失敗しなければどれでも正解よ♪
  end
end

# ※これ以降は変更しないこと。
if $0 == __FILE__
  require 'test/unit'

  class AnswerQ1Test < Test::Unit::TestCase
    def setup
      @fib = AnswerQ1.new
    end

    def test_each
      expected = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
      result = []
      @fib.each do |n|
        result << n
        break if result.size == 10
      end
      assert_equal(expected, result)
    end

    def test_drop
      expected = [8, 13, 21, 34, 55]
      result = []
      @fib.drop(5) do |n|
        result << n
        break if result.size == 5
      end
      assert_equal(expected, result)
    end

    def test_100th_fib
      expected = 354_224_848_179_261_915_075
      result = @fib.drop(99).first
      assert_equal(expected, result)
    end
  end
end