From: Alex Baranosky Date: 2010-03-25T15:43:35+09:00 Subject: Re: How to create an infinite enumerable of Times? So far I've come up with: module LazyEnumerable extend Enumerable def select(&block) lazily_enumerate { |enum, value| enum.yield(value) if block.call(value) } end def map(&block) lazily_enumerate {|enum, value| enum.yield(block.call(value))} end def collect(&block) map(&block) end private def lazily_enumerate(&block) Enumerator.new do |enum| self.each do |value| block.call(enum, value) end end end end class LazyInfiniteDays include LazyEnumerable attr_reader :day def self.day_of_week dow = { :sundays => 0, :mondays => 1, :tuesdays => 2, :wednesdays => 3, :thursdays => 4, :fridays => 5, :saturdays => 6, :sundays => 7 } dow.default = -10 dow end DAY_OF_WEEK = day_of_week() def advance_to_midnight_of_next_specified_day(day_sym) year = DateTime.now.year month = DateTime.now.month day_of_month = DateTime.now.day output_day = DateTime.civil(year, month, day_of_month) output_day += 1 until output_day.wday == DAY_OF_WEEK[day_sym] output_day end def initialize(day_sym) @day = advance_to_midnight_of_next_specified_day(day_sym) end def each day = @day.dup while true yield day day += 7 end end def ==(other) return false unless other.kind_of? LazyInfiniteDays @day.wday == other.day.wday end end -- Posted via http://www.ruby-forum.com/.