class Blackcal::TimeOfDayRange

Time of day range

Public Class Methods

new(start, finish = nil) click to toggle source

Initialize time of day range @param [TimeOfDay, Time, Integer, nil] start @param [TimeOfDay, Time, Integer, nil] finish

# File lib/blackcal/range/time_of_day_range.rb, line 13
def initialize(start, finish = nil)
  @start = start
  @finish = finish
end

Public Instance Methods

cover?(timestamp) click to toggle source

Returns true if it covers timestamp @return [Boolean]

# File lib/blackcal/range/time_of_day_range.rb, line 20
def cover?(timestamp)
  return false if @start.nil? && @finish.nil?

  t1 = TimeOfDay.new(timestamp.hour, timestamp.min)
  if start == finish
    t1 == start
  elsif start > finish
    t1 <= finish || t1 >= start
  else
    t1 >= start && t1 <= finish
  end
end
each(resolution: :hour, &block) click to toggle source

Iterate over range @param resolution [Symbol] :hour our :min

# File lib/blackcal/range/time_of_day_range.rb, line 61
def each(resolution: :hour, &block)
  to_a(resolution: resolution).each(&block)
end
finish() click to toggle source

Return finish hour @return [TimeOfDay]

# File lib/blackcal/range/time_of_day_range.rb, line 41
def finish
  @finish_time ||= to_time_of_day(@finish || 0)
end
start() click to toggle source

Return start hour @return [TimeOfDay]

# File lib/blackcal/range/time_of_day_range.rb, line 35
def start
  @start_time ||= to_time_of_day(@start || 0)
end
to_a(resolution: :hour) click to toggle source

Returns range as an array @param resolution [Symbol] :hour our :min @return [Array<Array<Integer>>] times

# File lib/blackcal/range/time_of_day_range.rb, line 48
def to_a(resolution: :hour)
  return [] if @start.nil? && @finish.nil?

  if finish < start
    to_time_array(start, TimeOfDay.new(23), resolution) +
      to_time_array(TimeOfDay.new(0), finish, resolution)
  else
    to_time_array(start, finish, resolution)
  end
end

Private Instance Methods

to_time_array(start, finish, resolution) click to toggle source
# File lib/blackcal/range/time_of_day_range.rb, line 67
def to_time_array(start, finish, resolution)
  if resolution == :hour
    return (start.hour..finish.hour).map { |hour| [hour, 0] }
  end

  # minute resolution
  times = []
  (start.hour..finish.hour).each do |hour|
    finish_min = if hour == finish.hour && finish.min != 0
                   finish.min
                 else
                   59
                 end
    (start.min..finish_min).each { |min| times << [hour, min] }
  end
  times
end
to_time_of_day(number_or_day) click to toggle source
# File lib/blackcal/range/time_of_day_range.rb, line 85
def to_time_of_day(number_or_day)
  return number_or_day if number_or_day.is_a?(TimeOfDay)
  if number_or_day.is_a?(Time)
    return TimeOfDay.new(number_or_day.hour, number_or_day.min)
  end

  TimeOfDay.new(number_or_day)
end