class Temporality::TimeSpan
Attributes
ends_on[RW]
starts_on[RW]
Public Class Methods
new(starts_on, ends_on, _options = {})
click to toggle source
# File lib/temporality/time_span.rb, line 7 def initialize(starts_on, ends_on, _options = {}) @starts_on = starts_on @ends_on = ends_on check! end
Public Instance Methods
<=>(time_span)
click to toggle source
# File lib/temporality/time_span.rb, line 56 def <=>(time_span) if @starts_on != time_span.starts_on @starts_on <=> time_span.starts_on else @ends_on <=> time_span.ends_on end end
==(time_span)
click to toggle source
# File lib/temporality/time_span.rb, line 48 def ==(time_span) @starts_on == time_span.starts_on && @ends_on == time_span.ends_on end
calendaires()
click to toggle source
# File lib/temporality/time_span.rb, line 32 def calendaires day_count end
covers?(time_span)
click to toggle source
# File lib/temporality/time_span.rb, line 44 def covers?(time_span) (@starts_on <= time_span.starts_on) && (@ends_on >= time_span.ends_on) end
day_count(excluded = [])
click to toggle source
TODO : Refactorer éventuellement pour avoir un algo ~o(1) au lieu de o(n) Utiliser Date#ld comme base pour un algo ~o(1)
# File lib/temporality/time_span.rb, line 24 def day_count(excluded = []) if excluded.empty? 1 + (@ends_on - @starts_on).to_i else (@starts_on..@ends_on).inject(0) { |c, day| c += excluded.include?(day.cwday) ? 0 : 1 } end end
eql?(time_span)
click to toggle source
# File lib/temporality/time_span.rb, line 52 def eql?(time_span) self.==(time_span) && (self.class == time_span.class) end
inspect()
click to toggle source
# File lib/temporality/time_span.rb, line 18 def inspect to_s end
intersect(time_span)
click to toggle source
# File lib/temporality/time_span.rb, line 72 def intersect(time_span) if time_span.is_a? TimeSpan intersects?(time_span) ? TimeSpan.new([@starts_on, time_span.starts_on].max, [@ends_on, time_span.ends_on].min) : nil elsif time_span.is_a? TimeSpanCollection # byebug r = time_span.map { |ts| intersect ts }.compact r.size > 1 ? TimeSpanCollection.new(r) : r.first end end
intersect!(time_span)
click to toggle source
# File lib/temporality/time_span.rb, line 111 def intersect!(time_span) @starts_on = [@starts_on, time_span.starts_on].max @ends_on = [@ends_on, time_span.ends_on].min check! end
intersects?(time_span)
click to toggle source
# File lib/temporality/time_span.rb, line 64 def intersects?(time_span) if time_span.respond_to?(:starts_on) && time_span.respond_to?(:ends_on) (time_span.ends_on >= @starts_on) && (time_span.starts_on <= @ends_on) elsif time_span.is_a?(TimeSpanCollection) time_span.any? { |ts| intersects? ts } end end
ouvrables()
click to toggle source
# File lib/temporality/time_span.rb, line 40 def ouvrables day_count [7] end
ouvres()
click to toggle source
# File lib/temporality/time_span.rb, line 36 def ouvres day_count [6, 7] end
substract(time_span)
click to toggle source
# File lib/temporality/time_span.rb, line 82 def substract(time_span) if time_span.is_a?(TimeSpan) if time_span.covers? self nil elsif !time_span.intersects? self dup elsif starts_on < time_span.starts_on && ends_on > time_span.ends_on TimeSpanCollection.new([ TimeSpan.new(starts_on, time_span.starts_on - 1), TimeSpan.new(time_span.ends_on + 1, ends_on) ]) elsif starts_on < time_span.starts_on && ends_on <= time_span.ends_on TimeSpan.new(starts_on, time_span.starts_on - 1) elsif starts_on >= time_span.starts_on && ends_on > time_span.ends_on TimeSpan.new(time_span.ends_on + 1, ends_on) else raise "That's one fucked up edge case" end elsif time_span.is_a?(TimeSpanCollection) TimeSpanCollection.new( time_span.inject(dup) do |res, ts| res.substract(ts) end ) else raise TypeError, 'Wrong type supplied, should be TimeSpan or TimeSpanCollection' end end
to_s()
click to toggle source
# File lib/temporality/time_span.rb, line 14 def to_s "{ TS : [#{starts_on} | #{ends_on}]}" end
Private Instance Methods
check!()
click to toggle source
# File lib/temporality/time_span.rb, line 123 def check! raise "Invalid dates : #{self}" unless valid? end
valid?()
click to toggle source
# File lib/temporality/time_span.rb, line 119 def valid? @starts_on <= @ends_on end