Search code examples
rubylazy-evaluationenumerable

How to create an infinite enumerable of Times?


I want to be able to have an object extend Enumerable in Ruby to be an infinite list of Mondays (for example).

So it would yield: March 29, April 5, April 12...... etc

How can I implement this in Ruby?


Solution

  • In 1.9 (and probably previous versions using backports), you can easily create enumerator:

    require 'date'
    
    def ndays_from(from, step=7)
      Enumerator.new {|y|
        loop {
          y.yield from
          from += step
        }
      }
    end
    
    e = ndays_from(Date.today)
    p e.take(5)
    #=> [#<Date: 2010-03-25 (4910561/2,0,2299161)>, #<Date: 2010-04-01 (4910575/2,0,2299161)>, #<Date: 2010-04-08 (4910589/2,0,2299161)>, #<Date: 2010-04-15 (4910603/2,0,2299161)>, #<Date: 2010-04-22 (4910617/2,0,2299161)>]