lib/hiccup/enumerable/monthly_enumerator.rb in hiccup-0.5.14 vs lib/hiccup/enumerable/monthly_enumerator.rb in hiccup-0.5.15

- old
+ new

@@ -1,82 +1,82 @@ require 'hiccup/enumerable/schedule_enumerator' module Hiccup module Enumerable class MonthlyEnumerator < ScheduleEnumerator - + def self.for(schedule) if schedule.monthly_pattern.empty? NeverEnumerator elsif schedule.monthly_pattern.all? { |occurrence| Fixnum === occurrence } MonthlyDateEnumerator else self end end - - - + + + def started? !@position.nil? end - - - + + + protected - + attr_reader :year, :month, :cycle, :last_day_of_month - - - + + + def advance! @position += 1 next_month if @position >= cycle.length - + day = cycle[@position] return self.next if day > last_day_of_month Date.new(year, month, day) rescue advance! end - + def rewind! @position -= 1 prev_month if @position < 0 - + day = cycle[@position] return self.prev if day > last_day_of_month Date.new(year, month, day) rescue rewind! end - - - + + + def first_occurrence_on_or_after(date) @year, @month, seed_day = date.year, date.month, date.day if skip > 1 offset = months_since_schedule_start(@year, @month) remainder = offset % skip if remainder > 0 add_to_months remainder seed_day = first_day_of_month end end - + get_context - + @position = cycle.index { |day| day >= seed_day } next_month unless @position - + day = cycle[@position] return self.next if day > last_day_of_month Date.new(year, month, day) rescue advance! end - + def first_occurrence_on_or_before(date) @year, @month, seed_day = date.year, date.month, date.day if skip > 1 offset = months_since_schedule_start(@year, @month) remainder = offset % skip @@ -84,25 +84,25 @@ subtract_from_months remainder get_context # figure out last_day_of_month seed_day = last_day_of_month end end - + get_context - + @position = cycle.rindex { |day| day <= seed_day } prev_month unless @position - + day = cycle[@position] return self.prev if day > last_day_of_month Date.new(year, month, day) rescue rewind! end - - - + + + def occurrences_in_month(year, month) wday_of_first_of_month = Date.new(year, month, 1).wday monthly_pattern.map do |occurrence| if occurrence.is_a?(Array) ordinal, weekday = occurrence @@ -115,51 +115,51 @@ else occurrence end end end - - - + + + def next_month @position = 0 add_to_months skip get_context end - + def add_to_months(offset) @month += offset @year, @month = @year + 1, @month - 12 while @month > 12 end - + def prev_month @position = @cycle.length - 1 subtract_from_months skip get_context end - + def subtract_from_months(offset) @month -= offset @year, @month = @year - 1, @month + 12 while @month < 1 end - + def get_context @last_day_of_month = [4, 6, 9, 11].member?(month) ? 30 : 31 @last_day_of_month = leap_year?(year) ? 29 : 28 if month == 2 @cycle = occurrences_in_month(year, month).sort end - - - + + + def months_since_schedule_start(year, month) (year - start_date.year) * 12 + (month - start_date.month) end - + def first_day_of_month 1 end - - + + end end end require "hiccup/enumerable/monthly_date_enumerator"