Class: Temporality::TimeSpan
- Inherits:
-
Object
- Object
- Temporality::TimeSpan
- Includes:
- Comparable
- Defined in:
- lib/temporality/time_span.rb
Direct Known Subclasses
Instance Attribute Summary collapse
-
#ends_on ⇒ Object
Returns the value of attribute ends_on.
-
#starts_on ⇒ Object
Returns the value of attribute starts_on.
Instance Method Summary collapse
- #<=>(time_span) ⇒ Object
- #==(time_span) ⇒ Object
- #calendaires ⇒ Object
- #covers?(time_span) ⇒ Boolean
-
#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).
- #eql?(time_span) ⇒ Boolean
-
#initialize(starts_on, ends_on, _options = {}) ⇒ TimeSpan
constructor
A new instance of TimeSpan.
- #inspect ⇒ Object
- #intersect(time_span) ⇒ Object
- #intersect!(time_span) ⇒ Object
- #intersects?(time_span) ⇒ Boolean
- #ouvrables ⇒ Object
- #ouvres ⇒ Object
- #substract(time_span) ⇒ Object
- #to_s ⇒ Object
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, = {}) @starts_on = starts_on @ends_on = ends_on check! end |
Instance Attribute Details
#ends_on ⇒ Object
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_on ⇒ Object
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 |
#calendaires ⇒ Object
32 33 34 |
# File 'lib/temporality/time_span.rb', line 32 def calendaires day_count end |
#covers?(time_span) ⇒ 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
52 53 54 |
# File 'lib/temporality/time_span.rb', line 52 def eql?(time_span) self.==(time_span) && (self.class == time_span.class) end |
#inspect ⇒ Object
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
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 |
#ouvrables ⇒ Object
40 41 42 |
# File 'lib/temporality/time_span.rb', line 40 def ouvrables day_count [7] end |
#ouvres ⇒ Object
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_s ⇒ Object
14 15 16 |
# File 'lib/temporality/time_span.rb', line 14 def to_s "{ TS : [#{starts_on} | #{ends_on}]}" end |