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