module Enumdate::DateFrame

SYNOPSIS: + Enumdate::DateFrame::Yearly.new(first_date, interval) + Enumdate::DateFrame::Monthly.new(first_date, interval) + Enumdate::DateFrame::Weekly.new(first_date, interval, wkst) + Enumdate::DateFrame::Daily.new(first_date, interval)

Iterate the date in frames of year, month, week, or day, and enumerate the first date of each frame.

~FIRST_DATE~ is an arbitrary date of the first frame.

+begin_src ruby Enumdate::DateFrame::Yearly.new(Date.new(2021, 1, 1), 2).lazy.map(&:to_s).take(3).force # => [“2021-01-01”, “2023-01-01”, “2025-01-01”]

Enumdate::DateFrame::Yearly.new(Date.new(2021, 6, 1), 2).lazy.map(&:to_s).take(3).force # => [“2021-01-01”, “2023-01-01”, “2025-01-01”]

Enumdate::DateFrame::Monthly.new(Date.new(2021, 6, 10), 2).lazy.map(&:to_s).take(3).force # => [“2021-06-01”, “2021-08-01”, “2021-10-01”] +end_src

~Enumdate::DateFrame::Weekly~ is sensitive to ~WKST~ param:

2021-06-08 is Tuesday: +begin_example

June 2021

Su Mo Tu We Th Fr Sa 30 31 1 2 3 4 5

6  7  8  9 10 11 12

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 +end_example

+begin_src ruby sun, mon, tue, wed = 0, 1, 2, 3

# If week start is Sunday: Enumdate::DateFrame::Weekly.new(Date.new(2021, 6, 8), 2, sun).lazy.map(&:to_s).take(3).force # => [“2021-06-06”, “2021-06-20”, “2021-07-04”]

# Monday (default): Enumdate::DateFrame::Weekly.new(Date.new(2021, 6, 8), 2, mon).lazy.map(&:to_s).take(3).force # => [“2021-06-07”, “2021-06-21”, “2021-07-05”]

# Tuesday: Enumdate::DateFrame::Weekly.new(Date.new(2021, 6, 8), 2, tue).lazy.map(&:to_s).take(3).force # => [“2021-06-08”, “2021-06-22”, “2021-07-06”]

# Wednesday: Enumdate::DateFrame::Weekly.new(Date.new(2021, 6, 8), 2, wed).lazy.map(&:to_s).take(3).force # => [“2021-06-02”, “2021-06-16”, “2021-06-30”]

Enumdate::DateFrame::Daily.new(Date.new(2021, 5, 15), 10).lazy.map(&:to_s).take(3).force # => [“2021-05-15”, “2021-05-25”, “2021-06-04”]

# `forward_to` method is helpful to jump to some specific date before the iteration. Enumdate::DateFrame::Yearly.new(Date.new(2021, 1, 1), 2).forward_to(Date.new(2100, 1, 1))

.lazy.map(&:to_s).take(3).force

# => [“2101-01-01”, “2103-01-01”, “2105-01-01”]

# Let's see how it differs from simply changing FIRST_DATE: Enumdate::DateFrame::Yearly.new(Date.new(2100, 1, 1), 2).lazy.map(&:to_s).take(3).force # => [“2100-01-01”, “2102-01-01”, “2104-01-01”] +end_src