class Biz::Calculation::ForDuration

Constants

UNITS

Attributes

scalar[R]
schedule[R]

Public Class Methods

new(schedule, scalar) click to toggle source
# File lib/biz/calculation/for_duration.rb, line 86
def initialize(schedule, scalar)
  @schedule = schedule
  @scalar   = Integer(scalar)

  fail ArgumentError, 'negative scalar' if @scalar.negative?
end
unit() click to toggle source
# File lib/biz/calculation/for_duration.rb, line 21
def self.unit
  name.split('::').last.downcase.to_sym
end
units() click to toggle source
# File lib/biz/calculation/for_duration.rb, line 11
def self.units
  UNITS
end
with_unit(schedule, scalar, unit) click to toggle source
# File lib/biz/calculation/for_duration.rb, line 15
def self.with_unit(schedule, scalar, unit)
  fail ArgumentError, 'unsupported unit' unless UNITS.include?(unit)

  public_send(unit, schedule, scalar)
end

Private Class Methods

day_class() click to toggle source
# File lib/biz/calculation/for_duration.rb, line 48
def self.day_class
  Class.new(self) do
    def before(time)
      periods(:before, time).first.end_time
    end

    def after(time)
      periods(:after, time).first.start_time
    end

    private

    def periods(direction, time)
      schedule
        .periods
        .public_send(
          direction,
          advanced_time(direction, schedule.in_zone.local(time))
        )
    end

    def advanced_time(direction, time)
      schedule
        .in_zone
        .on_date(
          schedule
            .dates
            .days(scalar)
            .public_send(direction, time.to_date),
          DayTime.from_time(time)
        )
    end
  end
end
time_class() click to toggle source
# File lib/biz/calculation/for_duration.rb, line 25
def self.time_class
  Class.new(self) do
    def before(time)
      advanced_periods(:before, time).last.start_time
    end

    def after(time)
      advanced_periods(:after, time).last.end_time
    end

    private

    def advanced_periods(direction, time)
      schedule
        .periods
        .public_send(direction, time)
        .timeline
        .for(Duration.public_send(unit, scalar))
        .to_a
    end
  end
end

Public Instance Methods

advanced_periods(direction, time) click to toggle source
# File lib/biz/calculation/for_duration.rb, line 37
def advanced_periods(direction, time)
  schedule
    .periods
    .public_send(direction, time)
    .timeline
    .for(Duration.public_send(unit, scalar))
    .to_a
end
advanced_time(direction, time) click to toggle source
# File lib/biz/calculation/for_duration.rb, line 69
def advanced_time(direction, time)
  schedule
    .in_zone
    .on_date(
      schedule
        .dates
        .days(scalar)
        .public_send(direction, time.to_date),
      DayTime.from_time(time)
    )
end
after(time) click to toggle source
# File lib/biz/calculation/for_duration.rb, line 31
def after(time)
  advanced_periods(:after, time).last.end_time
end
before(time) click to toggle source
# File lib/biz/calculation/for_duration.rb, line 27
def before(time)
  advanced_periods(:before, time).last.start_time
end
periods(direction, time) click to toggle source
# File lib/biz/calculation/for_duration.rb, line 60
def periods(direction, time)
  schedule
    .periods
    .public_send(
      direction,
      advanced_time(direction, schedule.in_zone.local(time))
    )
end

Private Instance Methods

unit() click to toggle source
# File lib/biz/calculation/for_duration.rb, line 98
def unit
  self.class.unit
end