Sha256: b364f4498137438bfa48de52ca84ba1a7612b32a42ada46978bae2df5ee77ec6

Contents?: true

Size: 1.47 KB

Versions: 1

Compression:

Stored size: 1.47 KB

Contents

# frozen_string_literal: true
module TimeBoss
  class Calendar
    module Support
      # Provides the ability to take a unit, and shift it into a different period, relative to today.
      module Shiftable
        PERIODS = %w[day week month quarter half year]

        PERIODS.each do |period|
          periods = period.pluralize

          define_method periods do
            calendar.send("#{periods}_for", self)
          end

          define_method period do
            entries = send(periods)
            return nil unless entries.length == 1
            entries.first
          end

          define_method "in_#{period}" do
            base = send(periods)
            return unless base.length == 1
            base.first.send(self.class.type.to_s.pluralize).find_index { |p| p == self } + 1
          end

          define_method "#{periods}_ago" do |offset|
            base_offset = send("in_#{period}") or return
            (calendar.send("this_#{period}") - offset).send(self.class.type.to_s.pluralize)[base_offset - 1]
          end

          define_method "last_#{period}" do
            send("#{periods}_ago", 1)
          end

          define_method "this_#{period}" do
            send("#{periods}_ago", 0)
          end

          define_method "#{periods}_ahead" do |offset|
            send("#{periods}_ago", offset * -1)
          end

          define_method "next_#{period}" do
            send("#{periods}_ahead", 1)
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
timeboss-0.1.0 lib/timeboss/calendar/support/shiftable.rb