Class: TimeRange
- Inherits:
-
Range
- Object
- Range
- TimeRange
- Defined in:
- lib/time_range.rb
Overview
# 2013-09-14 01:10:51 0400..2013-09-14 23:59:59 0400]
Class Method Summary collapse
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
- #orig_init ⇒ Object
- #subtract(*ranges) ⇒ Object
Constructor Details
#initialize(rbegin, rend) ⇒ TimeRange
Returns a new instance of TimeRange.
51 52 53 54 55 |
# File 'lib/time_range.rb', line 51 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
93 94 95 |
# File 'lib/time_range.rb', line 93 def self.for_date(date) TimeRange.new(date.to_time, (date + 1).to_time - 1) end |
.intersection(*tranges) ⇒ Object
97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/time_range.rb', line 97 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 |
.union(*tranges) ⇒ Object
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/time_range.rb', line 112 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
70 71 72 |
# File 'lib/time_range.rb', line 70 def fully_include?(time_rage) self.include?(time_rage.begin) && self.include?(time_rage.end) end |
#include?(time) ⇒ Boolean
66 67 68 |
# File 'lib/time_range.rb', line 66 def include?(time) self.begin <= time && self.end >= time end |
#intersection(range) ⇒ Object
62 63 64 |
# File 'lib/time_range.rb', line 62 def intersection(range) TimeRange.intersection(self, range) end |
#intersects?(range) ⇒ Boolean
57 58 59 60 |
# File 'lib/time_range.rb', line 57 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 |
#orig_init ⇒ Object
50 |
# File 'lib/time_range.rb', line 50 alias_method :orig_init, :initialize |
#subtract(*ranges) ⇒ Object
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/time_range.rb', line 74 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 |