time_frame 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d91f181ec54007dec205fb4f579cfea5239ab3a5
4
- data.tar.gz: 4f99fccea8014b5d159a1cbd7bc535a0825459fe
3
+ metadata.gz: 00c76a3400b8cad304f5c52c6b8d619f69dfd222
4
+ data.tar.gz: 0f77d91410ec48f03bf77a4522b53d6cad56caee
5
5
  SHA512:
6
- metadata.gz: db5553cf7505f6c75df2bb6d8b8f0024fdede6032333f70e69cef34052b3fdab50b81d0642dc974383f957437bb93d62c3f8ef993f31a5d91e3de26f15417c66
7
- data.tar.gz: aa430375956dc1cce91092b52f40fa8fffba961d1d232af9aba962ca1c540657e1a971b39ffec09de838010afbc66185b6e005b8f3c0d93609b2d69d4b59ffc3
6
+ metadata.gz: 452f866f8489f4c3611265981fe38c516e6f54f6d377476d7e34f927dc72121d74d824f0ebcebc09cbc51437c82d57a5793a902b61389295c603dee7c349ffd6
7
+ data.tar.gz: ea33d048127eea7b77e5470b0057ac0739cfe0e5a2955b9f16e9e0ddb515ba698eecf184b7d3d27b65d2d106b1149d5621e0f4755522457fae4fd7a026ee5520
@@ -6,70 +6,75 @@ class TimeFrame
6
6
  # given time_frames or covering time elements
7
7
  class Collection
8
8
  include Enumerable
9
- attr_reader :tree_nodes, :root
9
+
10
10
  def initialize(item_list = [], sorted = false, &block)
11
- @block = block ? block : ->(item) { item }
11
+ block ||= ->(item) { item }
12
12
  @tree_nodes = item_list.map do |item|
13
- TreeNode.new(item: item, &@block)
13
+ TreeNode.new(item: item, &block)
14
14
  end
15
-
16
- sort_list(@tree_nodes) unless sorted
17
- build_tree(0, @tree_nodes.size - 1)
18
- @root = @tree_nodes[(@tree_nodes.size - 1) / 2]
15
+ build_tree(sorted) if @tree_nodes.any?
19
16
  end
20
17
 
21
18
  def each(&block)
22
- tree_nodes.map { |node| node.item }.each(&block)
19
+ @tree_nodes.each do |node|
20
+ block.call(node.item)
21
+ end
23
22
  end
24
23
 
25
24
  def all_covering(time)
26
- result = []
27
- add_covering(time, @root, result)
28
- result.sort_by { |item | [@block.call(item).min, @block.call(item).max] }
25
+ [].tap do |result|
26
+ add_covering(time, @root, result) if any?
27
+ end
29
28
  end
30
29
 
31
30
  def all_intersecting(time_frame)
32
- result = []
33
- add_intersecting(time_frame, @root, result)
34
- result.sort_by { |item | [@block.call(item).min, @block.call(item).max] }
31
+ [].tap do |result|
32
+ add_intersecting(time_frame, @root, result) if any?
33
+ end
35
34
  end
36
35
 
37
36
  private
38
37
 
39
- def sort_list(item_list)
40
- item_list.sort_by! do |item|
38
+ def sort_nodes
39
+ @tree_nodes.sort_by! do |item|
41
40
  [item.time_frame.min, item.time_frame.max]
42
41
  end
43
42
  end
44
43
 
45
- def build_tree(lower, upper, ancestor = nil, side = nil)
44
+ def build_tree(sorted)
45
+ sort_nodes unless sorted
46
+ build_sub_tree(0, @tree_nodes.size - 1)
47
+ @root = @tree_nodes[(@tree_nodes.size - 1) / 2]
48
+ end
49
+
50
+ def build_sub_tree(lower, upper, ancestor = nil, side = nil)
46
51
  mid = (lower + upper) / 2
47
52
  node = @tree_nodes[mid]
48
53
 
49
54
  node.update_ancestor_relation(ancestor, side) if ancestor && side
50
55
 
51
- build_tree(lower, mid - 1, node, :left) unless lower == mid
52
- build_tree(mid + 1, upper, node, :right) unless upper == mid
56
+ build_sub_tree(lower, mid - 1, node, :left) unless lower == mid
57
+ build_sub_tree(mid + 1, upper, node, :right) unless upper == mid
53
58
 
54
59
  node.update_child_frame(node.child_time_frame) if lower == upper
55
60
  end
56
61
 
57
62
  def add_covering(time, node, result)
63
+ search_left = node.continue_left_side_search_for_time?(time)
64
+ search_right = node.continue_right_side_search_for_time?(time)
65
+
66
+ add_covering(time, node.left_child, result) if search_left
58
67
  result << node.item if node.time_frame.cover?(time)
59
- if node.continue_left_side_search_for_time?(time)
60
- add_covering(time, node.left_child, result)
61
- end
62
- return unless node.continue_right_side_search_for_time?(time)
63
- add_covering(time, node.right_child, result)
68
+ add_covering(time, node.right_child, result) if search_right
64
69
  end
65
70
 
66
71
  def add_intersecting(time_frame, node, result)
67
- result << node.item unless (node.time_frame & time_frame).empty?
68
- if node.continue_left_side_search_for_time_frame?(time_frame)
69
- add_intersecting(time_frame, node.left_child, result)
70
- end
71
- return unless node.continue_right_side_search_for_time_frame?(time_frame)
72
- add_intersecting(time_frame, node.right_child, result)
72
+ search_left = node.continue_left_side_search_for_time_frame?(time_frame)
73
+ search_right = node.continue_right_side_search_for_time_frame?(time_frame)
74
+
75
+ add_intersecting(time_frame, node.left_child, result) if search_left
76
+ result << node.item if node.time_frame.overlaps? time_frame
77
+ add_intersecting(time_frame, node.right_child, result) if search_right
73
78
  end
74
79
  end
75
80
  end
@@ -1,5 +1,5 @@
1
1
  # Encoding: utf-8
2
2
  # gem version
3
3
  class TimeFrame
4
- VERSION = '0.4.1'
4
+ VERSION = '0.4.2'
5
5
  end
@@ -16,6 +16,11 @@ describe TimeFrame::Collection do
16
16
 
17
17
  describe '#all_covering' do
18
18
  context 'when a pure time_frame tree is given' do
19
+ it 'returns an empty array if the collection is empty' do
20
+ collection = TimeFrame::Collection.new([])
21
+ expect(collection.all_covering(time)).to eq []
22
+ end
23
+
19
24
  it 'returns all covering time_frames' do
20
25
  time_frames = 20.times.map { |i| time_frame.shift_by((5 * i).days) }
21
26
  tree = TimeFrame::Collection.new(time_frames)
@@ -49,6 +54,11 @@ describe TimeFrame::Collection do
49
54
  end
50
55
 
51
56
  context 'when objects containing time_frames are given' do
57
+ it 'returns an empty array if the collection is empty' do
58
+ collection = TimeFrame::Collection.new([]) { |item| item.time_frame }
59
+ expect(collection.all_covering(time)).to eq []
60
+ end
61
+
52
62
  it 'returns all covering time_frames' do
53
63
  objects = 20.times.map do |i|
54
64
  OpenStruct.new(time_frame: time_frame.shift_by((5 * i).days))
@@ -90,6 +100,10 @@ describe TimeFrame::Collection do
90
100
 
91
101
  describe '#all_intersecting' do
92
102
  context 'when a pure time_frame tree is given' do
103
+ it 'returns an empty array if the collection is empty' do
104
+ collection = TimeFrame::Collection.new([])
105
+ expect(collection.all_intersecting(time)).to eq []
106
+ end
93
107
  it 'returns all intersecting time_frames' do
94
108
  time_frames = 20.times.map { |i| time_frame.shift_by((5 * i).days) }
95
109
  tree = TimeFrame::Collection.new(time_frames)
@@ -138,6 +152,10 @@ describe TimeFrame::Collection do
138
152
  end
139
153
 
140
154
  context 'when objects containing time_frames are given' do
155
+ it 'returns an empty array if the collection is empty' do
156
+ collection = TimeFrame::Collection.new([]) { |item| item.time_frame }
157
+ expect(collection.all_intersecting(time)).to eq []
158
+ end
141
159
  it 'returns all intersecting time_frames' do
142
160
  objects = 20.times.map do |i|
143
161
  OpenStruct.new(time_frame: time_frame.shift_by((5 * i).days))
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: time_frame
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick Derichs
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-10-14 00:00:00.000000000 Z
13
+ date: 2014-10-21 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rake