Class: TimeFrame

Inherits:
Object
  • 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_handler.rb,
lib/time_frame/time_frame_overlaps.rb,
lib/time_frame/time_frame_splitter.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, Handler, Overlaps, Splitter, Uniter

Constant Summary collapse

VERSION =
'0.6.1'
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

#maxObject (readonly)

Returns the value of attribute max.



9
10
11
# File 'lib/time_frame/time_frame.rb', line 9

def max
  @max
end

#minObject (readonly)

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



131
132
133
# File 'lib/time_frame/time_frame.rb', line 131

def self.covering_time_frame_for(time_frames)
  CoveredFrame.new(time_frames).frame
end

.each_overlap(frames1, frames2) ⇒ Object



135
136
137
138
139
# File 'lib/time_frame/time_frame.rb', line 135

def self.each_overlap(frames1, frames2)
  Overlaps.new(frames1, frames2).each do |first, second|
    yield(first, second)
  end
end

.intersection(time_frames) ⇒ Object



90
91
92
93
94
# File 'lib/time_frame/time_frame.rb', line 90

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



86
87
88
# File 'lib/time_frame/time_frame.rb', line 86

def self.union(time_frames, options = {})
  Uniter.new(time_frames, options).unite
end

Instance Method Details

#&(other) ⇒ Object



102
103
104
105
106
107
# File 'lib/time_frame/time_frame.rb', line 102

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

Returns:

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

Returns:

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

Returns:

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

#durationObject



21
22
23
# File 'lib/time_frame/time_frame.rb', line 21

def duration
  @duration ||= (@max_float - @min_float)
end

#empty?Boolean

Returns:

  • (Boolean)


82
83
84
# File 'lib/time_frame/time_frame.rb', line 82

def empty?
  false
end

#hashObject



36
37
38
# File 'lib/time_frame/time_frame.rb', line 36

def hash
  [min, max].hash
end

#inspectObject



141
142
143
# File 'lib/time_frame/time_frame.rb', line 141

def inspect
  "#{min}..#{max}"
end

#overlaps?(other) ⇒ Boolean

Returns true if the interior intersect.

Returns:

  • (Boolean)


97
98
99
100
# File 'lib/time_frame/time_frame.rb', line 97

def overlaps?(other)
  return false if other.duration == 0
  other.max_float > min_float && other.min_float < max_float
end

#shift_by(duration) ⇒ Object



109
110
111
# File 'lib/time_frame/time_frame.rb', line 109

def shift_by(duration)
  TimeFrame.new(min: @min + duration, duration: self.duration)
end

#shift_to(time) ⇒ Object



113
114
115
# File 'lib/time_frame/time_frame.rb', line 113

def shift_to(time)
  TimeFrame.new(min: time, duration: duration)
end

#split_by_interval(interval) ⇒ Object



127
128
129
# File 'lib/time_frame/time_frame.rb', line 127

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
79
80
# File 'lib/time_frame/time_frame.rb', line 69

def time_between(item)
  case
  when item.is_a?(TimeFrame)
    fail_if_empty item
    [time_between(item.min), time_between(item.max)].min_by(&:abs)
  when cover?(item)
    0
  else
    float_value = item.to_f
    [(float_value - min_float).abs, (float_value - max_float).abs].min
  end
end

#without(*args) ⇒ Object



117
118
119
120
121
122
123
124
125
# File 'lib/time_frame/time_frame.rb', line 117

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