Ruby で Haskell や Clojure の iterate

欲しかったので探したけど見つからなかったので書いてみた。

def iterate(init, &block)
  Enumerator.new do |y|
    loop do
      y << init
      init = block.call(init)
    end
  end
end
p iterate(1, &:succ).take(10)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

ブロックを渡している関係上引数の順序が逆だけど気にしない。
と言うか、すごく便利なのに本当に標準でないのか? 私が見つけられてないだけってことは…。Rubyist の皆さんは普段どうしているのだろう。