Class: TimeRange
- Inherits:
-
Range
- Object
- Range
- TimeRange
- Defined in:
- lib/time_range.rb
Overview
> 172798.0
Class Method Summary collapse
- .for_date(date) ⇒ Object
- .intersection(*tranges) ⇒ Object
- .sum_length(tranges) ⇒ Object
- .union(*tranges) ⇒ Object
Instance Method Summary collapse
- #fully_include?(time_rage) ⇒ Boolean
- #include?(time) ⇒ Boolean
-
#initialize(rbegin, rend) ⇒ TimeRange
constructor
A new instance of TimeRange.
- #intersection(range) ⇒ Object
- #intersects?(range) ⇒ Boolean
- #length ⇒ Object
- #orig_init ⇒ Object
- #subtract(*ranges) ⇒ Object
Constructor Details
#initialize(rbegin, rend) ⇒ TimeRange
Returns a new instance of TimeRange.
61 62 63 64 65 |
# File 'lib/time_range.rb', line 61 def initialize(rbegin, rend) raise WrongTimeRangeError, WRONG_ARG unless (rbegin.is_a?(Time) && rend.is_a?(Time)) rbegin, rend = rend, rbegin if rbegin > rend orig_init(rbegin, rend) end |
Class Method Details
.for_date(date) ⇒ Object
113 114 115 |
# File 'lib/time_range.rb', line 113 def self.for_date(date) TimeRange.new(date.to_time, (date + 1).to_time - 1) end |
.intersection(*tranges) ⇒ Object
117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/time_range.rb', line 117 def self.intersection(*tranges) return tranges if tranges.is_a?(TimeRange) tranges = tranges.flatten.sort!{|a,b| a.begin <=> b.begin} return tranges.first if (tranges.count == 1) first, second = tranges[0], tranges[1] if(tranges.count == 2) return nil unless first.intersects?(second) tbegin = [first.begin, second.begin].max tend = [first.end, second.end].min return TimeRange.new(tbegin, tend) elsif tranges.count > 2 return intersection([intersection(first, second), tranges[2..-1] ].flatten) if first.intersects?(second) end end |
.sum_length(tranges) ⇒ Object
149 150 151 152 153 154 155 |
# File 'lib/time_range.rb', line 149 def self.sum_length(tranges) result = 0.0 tranges.each do |range| result += range.length end result end |
.union(*tranges) ⇒ Object
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# File 'lib/time_range.rb', line 132 def self.union(*tranges) return tranges if tranges.is_a?(TimeRange) && tranges.begin != tranges.end tranges = tranges.flatten.sort{|a,b| a.begin <=> b.begin}.select{|trange| trange.begin != trange.end} return tranges.first if (tranges.count == 1) first, second = tranges[0], tranges[1] if(tranges.count == 2) return [first, second] unless first.intersects?(second) tbegin = [first.begin, second.begin].min tend = [first.end, second.end].max return TimeRange.new(tbegin, tend) elsif tranges.count > 2 return [ first, union(tranges[1..-1])].flatten unless first.intersects?(second) result = union([ union(first, second), tranges[2..-1]]) return result.is_a?(Array) ? result.flatten : result end end |
Instance Method Details
#fully_include?(time_rage) ⇒ Boolean
86 87 88 |
# File 'lib/time_range.rb', line 86 def fully_include?(time_rage) self.include?(time_rage.begin) && self.include?(time_rage.end) end |
#include?(time) ⇒ Boolean
76 77 78 79 80 81 82 83 84 |
# File 'lib/time_range.rb', line 76 def include?(time) if time.is_a?(Time) self.begin <= time && self.end >= time elsif time.is_a?(Date) self.begin.to_date <= time && self.end.to_date >= time else raise WrongTimeRangeError, WRONG_ARG end end |
#intersection(range) ⇒ Object
72 73 74 |
# File 'lib/time_range.rb', line 72 def intersection(range) TimeRange.intersection(self, range) end |
#intersects?(range) ⇒ Boolean
67 68 69 70 |
# File 'lib/time_range.rb', line 67 def intersects?(range) (self.begin >= range.begin && self.begin <= range.end) || (self.end >= range.begin && self.end <= range.end) || (range.begin >= self.begin && range.begin <= self.end) || (range.end >= self.begin && range.end <= self.end) end |
#length ⇒ Object
90 91 92 |
# File 'lib/time_range.rb', line 90 def length self.end - self.begin end |
#orig_init ⇒ Object
60 |
# File 'lib/time_range.rb', line 60 alias_method :orig_init, :initialize |
#subtract(*ranges) ⇒ Object
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/time_range.rb', line 94 def subtract(*ranges) ranges = ranges.flatten.sort{|a, b| a.begin <=> b.begin} return self if ranges.empty? result = [] ranges.each do |range| subtraction = self.intersection(TimeRange.new(self.begin, range.begin) ) if range.eql?(ranges.first) result << subtraction if subtraction if range.eql?(ranges.last) subtraction = self.intersection(TimeRange.new(range.end, self.end ) ) result << subtraction if subtraction else subtraction = self.intersection(TimeRange.new(range.end, ranges[ranges.index(range) + 1].begin )) result << subtraction if subtraction end end TimeRange.union(result) end |