Class: TimeFrame
- Inherits:
-
Object
show all
- Defined in:
- lib/time_frame/version.rb,
lib/time_frame/empty.rb,
lib/time_frame/tree_node.rb,
lib/time_frame/collection.rb,
lib/time_frame/time_frame.rb,
lib/time_frame/time_frame_uniter.rb,
lib/time_frame/time_frame_covered.rb,
lib/time_frame/time_frame_overlaps.rb,
lib/time_frame/time_frame_splitter.rb,
lib/time_frame/time_frame_predicate_builder_handler.rb
Overview
The time frame class provides an specialized and enhanced range for time values.
Direct Known Subclasses
Empty
Defined Under Namespace
Classes: Collection, CoveredFrame, Empty, Overlaps, PredicateBuilderHandler, Splitter, Uniter
Constant Summary
collapse
- VERSION =
'0.6.2'
- EMPTY =
Empty.instance
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(args) ⇒ TimeFrame
Returns a new instance of TimeFrame.
13
14
15
16
17
18
19
|
# File 'lib/time_frame/time_frame.rb', line 13
def initialize(args)
@min = args.fetch(:min)
@max = args.fetch(:max) { @min + args.fetch(:duration) }
check_bounds
@max_float = @max.to_f
@min_float = @min.to_f
end
|
Instance Attribute Details
#max ⇒ Object
Returns the value of attribute max.
9
10
11
|
# File 'lib/time_frame/time_frame.rb', line 9
def max
@max
end
|
#min ⇒ Object
Returns the value of attribute min.
9
10
11
|
# File 'lib/time_frame/time_frame.rb', line 9
def min
@min
end
|
Class Method Details
.covering_time_frame_for(time_frames) ⇒ Object
129
130
131
|
# File 'lib/time_frame/time_frame.rb', line 129
def self.covering_time_frame_for(time_frames)
CoveredFrame.new(time_frames).frame
end
|
.each_overlap(frames1, frames2) ⇒ Object
133
134
135
136
137
|
# File 'lib/time_frame/time_frame.rb', line 133
def self.each_overlap(frames1, frames2)
Overlaps.new(frames1, frames2).each do |first, second|
yield first, second
end
end
|
.intersection(time_frames) ⇒ Object
88
89
90
91
92
|
# File 'lib/time_frame/time_frame.rb', line 88
def self.intersection(time_frames)
time_frames.reduce(time_frames.first) do |intersection, time_frame|
intersection & time_frame
end
end
|
.union(time_frames, options = {}) ⇒ Object
84
85
86
|
# File 'lib/time_frame/time_frame.rb', line 84
def self.union(time_frames, options = {})
Uniter.new(time_frames, options).unite
end
|
Instance Method Details
#&(other) ⇒ Object
100
101
102
103
104
105
|
# File 'lib/time_frame/time_frame.rb', line 100
def &(other)
return EMPTY if other.empty?
new_min = [min, other.min].max
new_max = [max, other.max].min
new_min <= new_max ? TimeFrame.new(min: new_min, max: new_max) : EMPTY
end
|
#<=>(other) ⇒ Object
30
31
32
|
# File 'lib/time_frame/time_frame.rb', line 30
def <=>(other)
[@min_float, @max_float] <=> [other.min_float, other.max_float]
end
|
#==(other) ⇒ Object
Also known as:
eql?
25
26
27
28
|
# File 'lib/time_frame/time_frame.rb', line 25
def ==(other)
@min_float == other.min_float &&
@max_float == other.max_float
end
|
#after?(item) ⇒ Boolean
59
60
61
62
63
64
65
66
67
|
# File 'lib/time_frame/time_frame.rb', line 59
def after?(item)
case
when item.is_a?(TimeFrame)
fail_if_empty item
item.max_float < min_float
else
item.to_f < min_float
end
end
|
#before?(item) ⇒ Boolean
49
50
51
52
53
54
55
56
57
|
# File 'lib/time_frame/time_frame.rb', line 49
def before?(item)
case
when item.is_a?(TimeFrame)
fail_if_empty item
item.min_float > max_float
else
item.to_f > max_float
end
end
|
#cover?(element) ⇒ Boolean
40
41
42
43
44
45
46
47
|
# File 'lib/time_frame/time_frame.rb', line 40
def cover?(element)
if element.is_a?(TimeFrame)
element.empty? ||
@min_float <= element.min_float && element.max_float <= max_float
else
min_float <= element.to_f && element.to_f <= max_float
end
end
|
#duration ⇒ Object
21
22
23
|
# File 'lib/time_frame/time_frame.rb', line 21
def duration
@duration ||= (@max_float - @min_float)
end
|
#empty? ⇒ Boolean
80
81
82
|
# File 'lib/time_frame/time_frame.rb', line 80
def empty?
false
end
|
#hash ⇒ Object
36
37
38
|
# File 'lib/time_frame/time_frame.rb', line 36
def hash
[min, max].hash
end
|
#inspect ⇒ Object
139
140
141
|
# File 'lib/time_frame/time_frame.rb', line 139
def inspect
"#{min}..#{max}"
end
|
#overlaps?(other) ⇒ Boolean
Returns true if the interior intersect.
95
96
97
98
|
# File 'lib/time_frame/time_frame.rb', line 95
def overlaps?(other)
return false if other.duration == 0
other.max_float > min_float && other.min_float < max_float
end
|
#shift_by(duration) ⇒ Object
107
108
109
|
# File 'lib/time_frame/time_frame.rb', line 107
def shift_by(duration)
TimeFrame.new(min: @min + duration, duration: self.duration)
end
|
#shift_to(time) ⇒ Object
111
112
113
|
# File 'lib/time_frame/time_frame.rb', line 111
def shift_to(time)
TimeFrame.new(min: time, duration: duration)
end
|
#split_by_interval(interval) ⇒ Object
125
126
127
|
# File 'lib/time_frame/time_frame.rb', line 125
def split_by_interval(interval)
Splitter.new(self).split_by interval
end
|
#time_between(item) ⇒ Object
69
70
71
72
73
74
75
76
77
78
|
# File 'lib/time_frame/time_frame.rb', line 69
def time_between(item)
case
when item.is_a?(TimeFrame)
time_between_time_frame(item)
when cover?(item)
0
else
time_between_float(item.to_f)
end
end
|
#without(*args) ⇒ Object
115
116
117
118
119
120
121
122
123
|
# File 'lib/time_frame/time_frame.rb', line 115
def without(*args)
frames = args.select { |frame| overlaps?(frame) }
frames = TimeFrame.union(frames)
frames.reduce([self]) do |result, frame_to_exclude|
last_frame = result.pop
result + last_frame.without_frame(frame_to_exclude)
end
end
|