class Temporality::SliceCollection

Attributes

slices[RW]

Public Class Methods

new(values = nil) click to toggle source
# File lib/temporality/slice_collection.rb, line 8
def initialize(values = nil)
  collection_from_history(values) if values
end

Private Class Methods

not_period_complete!() click to toggle source
# File lib/temporality/slice_collection.rb, line 70
def self.not_period_complete!
  raise 'Not period complete'
end

Public Instance Methods

fill_missing_with!(slices, time_span) click to toggle source

Remplit les 'trous' d'une collection de slices par rapport à un time_span de référence en utilisant les valeurs disponibles dans la collection de slices passée en paramètre

# File lib/temporality/slice_collection.rb, line 27
def fill_missing_with!(slices, time_span)
  self << slices.intersect(time_span.substract(self))
  flatten!
  sort!
end
intersect(tsc) click to toggle source
# File lib/temporality/slice_collection.rb, line 39
def intersect(tsc)
  if tsc.is_a? TimeSpanCollection
    tsc.inject(SliceCollection.new) do |r, s|
      r << intersect(s)
    end.compact.sort
  elsif tsc.is_a? TimeSpan
    map { |s| s.intersect tsc }.compact
  end
end
to_s() click to toggle source
# File lib/temporality/slice_collection.rb, line 12
def to_s
  "{SLC : #{map(&:to_s) .join(', ')}}"
end
value_for(time_span) click to toggle source
# File lib/temporality/slice_collection.rb, line 33
def value_for(time_span)
  detect do |slice|
    slice.covers? time_span
  end.value
end

Private Instance Methods

<=>(slice_collection) click to toggle source
# File lib/temporality/slice_collection.rb, line 74
def <=>(slice_collection)
  (size == slice_collection.slices.size) && all? { |slice| slice_collection.include?(slice) }
end
collection_from_history(values) click to toggle source
# File lib/temporality/slice_collection.rb, line 51
def collection_from_history(values)
  sorted_values = values.sort do |a, b|
    a.starts_on <=> b.starts_on
  end

  previous_slice = nil

  sorted_values.each_with_index do |v, _i|
    slice = Slice.new(v.starts_on, v.ends_on, v.value)

    if previous_slice
      raise 'Overlapping slices!' if slice.starts_on <= previous_slice.ends_on
      not_period_complete! if previous_slice.ends_on.advance(days: 1) < slice.starts_on
    end

    self.<<(slice)
  end
end
method_missing(_method, *_args) click to toggle source
# File lib/temporality/slice_collection.rb, line 78
def method_missing(_method, *_args)
  raise SlicedConceptInterrupt
end