range_tree 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8d1823bf3fb8b7ad048e704508d6a753a05a8456
4
- data.tar.gz: 707cff2d18006ca2991a63622641b84274311474
3
+ metadata.gz: 552e16f04941f365c8d797abeecadf997bc3236b
4
+ data.tar.gz: 988458a90161548d0315f71ae4a1a792b32ee3b7
5
5
  SHA512:
6
- metadata.gz: ebb2ce6159ca59749afd5242d7b0fc0106a12fa95f6d2a662e9406dccdf091ef176c2d65d123a90576ced40906b997d672795d3e6b1eca83b393ca6dc761efe4
7
- data.tar.gz: afa957ed7156481bed9bb21d8f44c5bb6a08accd74d90214612e4bbd2945a603f5728b8528923aaf634ec53e04f819291444100ee82253b14c2d68d393bc49eb
6
+ metadata.gz: e5046afdd74928607ad7d5aeab0ee19def4b1c4e9c521213af524e5175919073446f76b1e67c6aa6c1f27306d2c115c376b8bff2365234ad4175f4cb31313777
7
+ data.tar.gz: a162d96f995118d6ca4902cbacd9cae3ef1f717d1719453fbda7b56d4cfd99c12c71c4da30d4abd120e3657e5cdbdaabc4e65219ad67092f050af61265f7cf98
data/README.md CHANGED
@@ -14,7 +14,7 @@ For small trees you can use the default settings
14
14
  which rebuild the tree every time you add a value.
15
15
 
16
16
  If you need to build a very large tree with 1000's of values
17
- you need to pass ```rebuild_on_add: false``` to the tree.
17
+ you need to pass a first argument of (rebuild_on_add) ```false``` to the tree.
18
18
  Then add everything to your tree and only once it is complete
19
19
  you must call ```tree.rebuild``` to build your index.
20
20
 
@@ -36,61 +36,76 @@ Or install it yourself as:
36
36
 
37
37
  ## Usage
38
38
 
39
- # Below is an example using integers (formatted as dates) as keys. You can just as easily use dates, times
40
- # floats or other comparable types.
41
-
42
- require 'range_tree'
43
-
44
- staff_holidays = RangeTree::Tree.new
45
-
46
- staff_holidays[2000_01_01, 2000_01_15] = "John"
47
- staff_holidays[2000_01_15, 2000_01_31] = "Greig"
48
- staff_holidays[2000_01_20, 2000_02_05] = "Eve"
49
- staff_holidays[2000_01_03, 2000_01_08] = "Alice"
50
- staff_holidays[2000_01_18, 2000_01_20] = "Bob"
51
-
52
- # Check who is on holiday on certain dates
53
- staff_holidays[2000_01_04]
54
- => ["Alice", "John"]
55
-
56
- # Check all staff members on holiday within a certain period by passing a range
57
- staff_holidays[2000_01_12..2011_01_19]
58
- => ["John", "Bob", "Greig", "Eve"]
59
-
60
-
61
- # Iterate through all periods where the system state changes
62
- staff_holidays.distinct.each do |date, staff|
63
- puts "From #{date} #{staff} will be on holiday"
64
- end
65
-
66
- =>
67
- From 20000101 ["John"] will be on holiday
68
- From 20000103 ["John", "Alice"] will be on holiday
69
- From 20000109 ["John"] will be on holiday
70
- From 20000115 ["John", "Greig"] will be on holiday
71
- From 20000116 ["Greig"] will be on holiday
72
- From 20000118 ["Greig", "Bob"] will be on holiday
73
- From 20000120 ["Greig", "Bob", "Eve"] will be on holiday
74
- From 20000121 ["Greig", "Eve"] will be on holiday
75
- From 20000132 ["Eve"] will be on holiday
76
- From 20000206 [] will be on holiday
77
-
78
- # Iterate though all periods in the tree.
79
- staff_holidays.all.each do |date, staff|
80
- puts "#{staff} is on holiday on #{date}"
81
- end
82
-
83
- =>
84
- ["John"] is on holiday on 20000101
85
- ["John"] is on holiday on 20000102
86
- ["John", "Alice"] is on holiday on 20000103
87
- ["John", "Alice"] is on holiday on 20000104
88
- ["John", "Alice"] is on holiday on 20000105
89
- ["John", "Alice"] is on holiday on 20000106
90
- ["John", "Alice"] is on holiday on 20000107
91
- ["John", "Alice"] is on holiday on 20000108
92
- ["John"] is on holiday on 20000109
93
- ["John"] is on holiday on 20000110
94
- ["John"] is on holiday on 20000111
95
- ...
96
39
 
40
+ ```ruby
41
+ # Below is an example using integers (formatted as dates) as keys. You can just as easily use dates, times
42
+ # floats or other comparable types.
43
+
44
+ require 'range_tree'
45
+
46
+ staff_holidays = RangeTree::Tree.new
47
+
48
+ staff_holidays[2000_01_01, 2000_01_15] = "John"
49
+ staff_holidays[2000_01_15, 2000_01_31] = "Greig"
50
+ staff_holidays[2000_01_20, 2000_02_05] = "Eve"
51
+ staff_holidays[2000_01_03, 2000_01_08] = "Alice"
52
+ staff_holidays[2000_01_18, 2000_01_20] = "Bob"
53
+
54
+ # Check who is on holiday on certain dates
55
+ staff_holidays[2000_01_04]
56
+ => ["Alice", "John"]
57
+
58
+ # Check all staff members on holiday within a certain period by passing a range
59
+ staff_holidays[2000_01_12..2011_01_19]
60
+ => ["John", "Bob", "Greig", "Eve"]
61
+
62
+
63
+ # Iterate through all periods where the system state changes
64
+ staff_holidays.distinct.each do |date, staff|
65
+ puts "From #{date} #{staff} will be on holiday"
66
+ end
67
+
68
+ =>
69
+ From 20000101 ["John"] will be on holiday
70
+ From 20000103 ["John", "Alice"] will be on holiday
71
+ From 20000109 ["John"] will be on holiday
72
+ From 20000115 ["John", "Greig"] will be on holiday
73
+ From 20000116 ["Greig"] will be on holiday
74
+ From 20000118 ["Greig", "Bob"] will be on holiday
75
+ From 20000120 ["Greig", "Bob", "Eve"] will be on holiday
76
+ From 20000121 ["Greig", "Eve"] will be on holiday
77
+ From 20000132 ["Eve"] will be on holiday
78
+ From 20000206 [] will be on holiday
79
+
80
+ # Iterate though all periods in the tree.
81
+ staff_holidays.all.each do |date, staff|
82
+ puts "#{staff} is on holiday on #{date}"
83
+ end
84
+
85
+ =>
86
+ ["John"] is on holiday on 20000101
87
+ ["John"] is on holiday on 20000102
88
+ ["John", "Alice"] is on holiday on 20000103
89
+ ["John", "Alice"] is on holiday on 20000104
90
+ ["John", "Alice"] is on holiday on 20000105
91
+ ["John", "Alice"] is on holiday on 20000106
92
+ ["John", "Alice"] is on holiday on 20000107
93
+ ["John", "Alice"] is on holiday on 20000108
94
+ ["John"] is on holiday on 20000109
95
+ ["John"] is on holiday on 20000110
96
+ ["John"] is on holiday on 20000111
97
+ ...
98
+
99
+ # Remove values from tree
100
+
101
+ staff_holidays >> "John"
102
+ # or
103
+ staff_holidays.remove "John"
104
+
105
+ # Get smallest or largest keys in tree
106
+ staff_holidays.max
107
+ => 2000_02_05
108
+
109
+ staff_holidays.min
110
+ => 2000_01_01
111
+ ```
@@ -5,9 +5,7 @@ module RangeTree
5
5
  require 'set'
6
6
  attr_accessor :children, :root, :starts, :ends, :rebuild_on_add
7
7
 
8
- MAX_REBUILD_SIZE = 500
9
-
10
- def initialize(rebuild_on_add: true)
8
+ def initialize(rebuild_on_add=true)
11
9
  self.children = []
12
10
  self.rebuild_on_add = rebuild_on_add
13
11
  self.starts = Hash.new{|h,k| h[k] = []}
@@ -30,6 +28,14 @@ module RangeTree
30
28
  remove(value)
31
29
  end
32
30
 
31
+ def min
32
+ self.root && self.root.min
33
+ end
34
+
35
+ def max
36
+ self.root && self.root.max
37
+ end
38
+
33
39
  def remove(value)
34
40
  return unless node_to_remove = self.children.find{|child| child.value == value}
35
41
  self.children.delete(node_to_remove)
@@ -68,6 +74,18 @@ module RangeTree
68
74
  end
69
75
  end
70
76
 
77
+ def to_s
78
+ if self.root
79
+ "RangeTree[#{root.min}..#{root.max}]"
80
+ else
81
+ "RangeTree[empty]"
82
+ end
83
+ end
84
+
85
+ def inspect
86
+ "#{self}"
87
+ end
88
+
71
89
  private
72
90
  def iterate(range)
73
91
  return [] unless self.root
@@ -1,3 +1,3 @@
1
1
  module RangeTree
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: range_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wouter Coppieters