Class: Temporality::TimeSpan

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/temporality/time_span.rb

Direct Known Subclasses

Slice

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(starts_on, ends_on, _options = {}) ⇒ TimeSpan

Returns a new instance of TimeSpan.



7
8
9
10
11
12
# 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

Instance Attribute Details

#ends_onObject

Returns the value of attribute ends_on.



5
6
7
# File 'lib/temporality/time_span.rb', line 5

def ends_on
  @ends_on
end

#starts_onObject

Returns the value of attribute starts_on.



5
6
7
# File 'lib/temporality/time_span.rb', line 5

def starts_on
  @starts_on
end

Instance Method Details

#<=>(time_span) ⇒ Object



56
57
58
59
60
61
62
# 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) ⇒ Object



48
49
50
# File 'lib/temporality/time_span.rb', line 48

def ==(time_span)
  @starts_on == time_span.starts_on && @ends_on == time_span.ends_on
end

#calendairesObject



32
33
34
# File 'lib/temporality/time_span.rb', line 32

def calendaires
  day_count
end

#covers?(time_span) ⇒ Boolean

Returns:

  • (Boolean)


44
45
46
# 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 = []) ⇒ Object

TODO : Refactorer éventuellement pour avoir un algo ~o(1) au lieu de o(n) Utiliser Date#ld comme base pour un algo ~o(1)



24
25
26
27
28
29
30
# 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) ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/temporality/time_span.rb', line 52

def eql?(time_span)
  self.==(time_span) && (self.class == time_span.class)
end

#inspectObject



18
19
20
# File 'lib/temporality/time_span.rb', line 18

def inspect
  to_s
end

#intersect(time_span) ⇒ Object



72
73
74
75
76
77
78
79
80
# 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) ⇒ Object



111
112
113
114
115
# 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) ⇒ Boolean

Returns:

  • (Boolean)


64
65
66
67
68
69
70
# 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

#ouvrablesObject



40
41
42
# File 'lib/temporality/time_span.rb', line 40

def ouvrables
  day_count [7]
end

#ouvresObject



36
37
38
# File 'lib/temporality/time_span.rb', line 36

def ouvres
  day_count [6, 7]
end

#substract(time_span) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# 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_sObject



14
15
16
# File 'lib/temporality/time_span.rb', line 14

def to_s
  "{ TS : [#{starts_on} | #{ends_on}]}"
end