Class: Hiccup::Enumerable::AnnuallyEnumerator

Inherits:
ScheduleEnumerator show all
Defined in:
lib/hiccup/enumerable/annually_enumerator.rb

Instance Attribute Summary

Attributes inherited from ScheduleEnumerator

#schedule

Instance Method Summary collapse

Methods inherited from ScheduleEnumerator

#next, #next_occurrence_after, #next_occurrence_before, #prev

Constructor Details

#initialize(*args) ⇒ AnnuallyEnumerator

Returns a new instance of AnnuallyEnumerator.



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/hiccup/enumerable/annually_enumerator.rb', line 8

def initialize(*args)
  super
  
  # Use more efficient iterator methods unless
  # we have to care about leap years
  
  unless start_date.month == 2 && start_date.day == 29
    def self.next_occurrence_after(date)
      date.next_year(skip)
    end
    
    def self.next_occurrence_before(date)
      date.prev_year(skip)
    end
  end
end

Instance Method Details

#first_occurrence_on_or_after(date) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/hiccup/enumerable/annually_enumerator.rb', line 26

def first_occurrence_on_or_after(date)
  year, month, day = date.year, start_date.month, start_date.day
  day = -1 if month == 2 && day == 29
  
  result = Date.new(year, month, day)
  year += 1 if result < date
  
  remainder = (year - start_date.year) % skip
  year += (skip - remainder) if remainder > 0
  
  Date.new(year, month, day)
end

#first_occurrence_on_or_before(date) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/hiccup/enumerable/annually_enumerator.rb', line 39

def first_occurrence_on_or_before(date)
  year, month, day = date.year, start_date.month, start_date.day
  day = -1 if month == 2 && day == 29
  
  result = Date.new(year, month, day)
  year -= 1 if result > date
  
  # what if year is before start_date.year?
  remainder = (year - start_date.year) % skip
  year -= remainder if remainder > 0
  
  Date.new(year, month, day)
end