Class: TimeRange

Inherits:
Range
  • Object
show all
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

Constructor Details

#initialize(rbegin, rend) ⇒ TimeRange

Returns a new instance of TimeRange.

Raises:

  • (WrongTimeRangeError)


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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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_initObject



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