class ScheduledValue::ScheduledValue

Attributes

timespans[R]

Public Class Methods

always(value) click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 9
def self.always(value)
  timespan = timespan_with_value_class.new(start: nil, finish: nil, value: value)
  self.new(timespans: [timespan])
end
new(timespans: []) click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 21
def initialize(timespans: [])
  self.timespans = timespans
end
timespan_with_value_class() click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 5
def self.timespan_with_value_class
  TimespanWithValue
end

Public Instance Methods

<<(timespan_with_value) click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 56
def <<(timespan_with_value)
  overlapping_timespan = timespan_overlapping(timespan_with_value)
  raise "Timespan for value #{overlapping_timespan} would overlap with #{timespan_with_value}" if overlapping_timespan

  @timespans << timespan_with_value
  @timespans_array = nil

  timespan_with_value
end
attributes() click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 25
def attributes
  {
    timespans: timespans
  }
end
attributes=(attributes) click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 35
def attributes=(attributes)
  self.timespans = attributes[:timespans] || attributes['timespans']
end
covers_all_time?() click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 89
def covers_all_time?
  timespans_array = timespans.to_a
  return false if timespans_array.empty?

  !timespans_array.first.start && !timespans_array.last.finish
end
from_json(json, include_root = false) click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 14
def from_json(json, include_root = false)
  hash = JSON.parse(json)
  hash = hash.values.first if include_root
  self.attributes = hash
  self
end
has_value_at?(timestamp) click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 71
def has_value_at?(timestamp)
  !!(timespan_containing(timestamp))
end
next_value_change_after(timestamp) click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 82
def next_value_change_after(timestamp)
  timespan = timespan_containing(timestamp)
  return nil unless timespan

  timespan.finish
end
set_value_for_timespan(start, finish, value) click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 66
def set_value_for_timespan(start, finish, value)
  self << self.class.timespan_with_value_class.new(start: start, finish: finish, vaule: value)
  value
end
timespans=(timespan_values) click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 39
def timespans=(timespan_values)
  @timespans = SortedSet.new

  timespan_values.each do |timespan_value|
    timespan = case timespan_value
    when self.class.timespan_with_value_class then timespan_value
    when Hash then
      attributes = timespan_value.each_with_object({}) { |(key, value), hash| hash[key.to_sym] = value }
      self.class.timespan_with_value_class.new(**attributes)
    end

    self << timespan if timespan
  end

  @timespans
end
to_hash(*) click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 31
def to_hash(*)
  attributes
end
value_at(timestamp) click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 75
def value_at(timestamp)
  timespan = timespan_containing(timestamp)
  raise "No timespan found for #{timestamp}" unless timespan

  timespan.value
end

Private Instance Methods

timespan_containing(timestamp) click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 102
def timespan_containing(timestamp)
  timespans_array.bsearch do |timespan|
    if timespan.contains? timestamp
      0
    else
      (timespan <=> timestamp) * -1
    end
  end
end
timespan_overlapping(timespan) click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 112
def timespan_overlapping(timespan)
  timespans.find { |my_timespan| my_timespan.overlaps? timespan }
end
timespans_array() click to toggle source
# File lib/scheduled_value/scheduled_value.rb, line 98
def timespans_array
  @timespans_array ||= timespans.to_a
end