fractional_indexer 0.2.0 → 0.3.1

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
  SHA256:
3
- metadata.gz: 529455a944319ae06942cb577687a1c6d06e2869316d0f715c7a03415704c0a9
4
- data.tar.gz: afccd5d154f1637648c6418637d4243a518c0774f575a4b2eea909db0f89e762
3
+ metadata.gz: 0d3588d2624cbc372dd3013729e5543eeabf9ab227005bf5c7a02e59360d7dcb
4
+ data.tar.gz: 1b11cf313ea2e71ed55bab5f394fcab8d1797e08b7a86df7012bcfafe43d0f68
5
5
  SHA512:
6
- metadata.gz: ab6facf8bbf718cdc36fd3bfb74d27913b3f68635b1a573e72426ee70a1d132b860f0008cef13d6bca89273f24ca226c765e4a44f80591e5da058e8e9fe71518
7
- data.tar.gz: 933bf9eca9dfd21b40ba7fda2bb4951cf198fd398580e800118366fd5b58e4514b5744739ecb5192ef4b5dbea4b1a5994f692de79e7ed329a5875512f8f9d4be
6
+ metadata.gz: d8735e7f53ea599b2a3cbfdaafd34cd2c854991c461d02b4383a7a47fb36ab956d9bbdbd80c0cf018ab668050133e0039c4e117e654cba77da2ee9fe964b70b9
7
+ data.tar.gz: 6b4c53291cb4fb77ebb3fb279531693a8b2c6c74dd1ad775e6bb69d19bd2e23d742a3316c9922df94dcaad24a3af0c260b14aa3caacf4b7f142844f1fb9537bc
data/README.md CHANGED
@@ -61,6 +61,26 @@ FractionalIndexer.generate_key(prev_key: 'a1', next_key: 'a1')
61
61
  # => error
62
62
  ```
63
63
 
64
+ ### Generate Multiple Order keys
65
+
66
+ To generate multiple order keys, use the `FractionalIndexer.generate_keys` method.
67
+
68
+ ```ruby
69
+ require 'fractional_indexer'
70
+
71
+ # generate n order keys that sequentially follow a given prev_key.
72
+ FractionalIndexer.generate_keys(prev_key: "b11", count: 5)
73
+ # => ["b12", "b13", "b14", "b15", "b16"]
74
+
75
+ # generate n order keys that sequentially precede a given next_key.
76
+ FractionalIndexer.generate_keys(next_key: "b11", count: 5)
77
+ # => ["b0w", "b0x", "b0y", "b0z", "b10"]
78
+
79
+ # generate n order keys between the given prev_key and next_key.
80
+ FractionalIndexer.generate_keys(prev_key: "b10", next_key: "b11", count: 5)
81
+ # => ["b108", "b10G", "b10V", "b10d", "b10l"]
82
+ ```
83
+
64
84
  ## Configure
65
85
 
66
86
  ### base
@@ -39,9 +39,5 @@ module FractionalIndexer
39
39
  def borrow?(index)
40
40
  index == -1
41
41
  end
42
-
43
- def digits
44
- FractionalIndexer.configuration.digits
45
- end
46
42
  end
47
43
  end
@@ -39,9 +39,5 @@ module FractionalIndexer
39
39
  def carry_over?(index)
40
40
  index == digits.length
41
41
  end
42
-
43
- def digits
44
- FractionalIndexer.configuration.digits
45
- end
46
42
  end
47
43
  end
@@ -45,19 +45,15 @@ module FractionalIndexer
45
45
 
46
46
  private
47
47
 
48
- def digits
49
- FractionalIndexer.configuration.digits
50
- end
51
-
52
48
  def validate_positions!(prev_pos, next_pos)
53
- raise FractionalIndexerError, "prev_pos must be less than next_pos" if !next_pos.empty? && prev_pos >= next_pos
49
+ raise Error, "prev_pos must be less than next_pos" if !next_pos.empty? && prev_pos >= next_pos
54
50
 
55
51
  # NOTE
56
52
  # In a string, "0.3" and "0.30" are mathematically equivalent.
57
53
  # Therefore, a trailing "0" is prohibited.
58
54
  return unless prev_pos.end_with?(digits.first) || next_pos.end_with?(digits.first)
59
55
 
60
- raise FractionalIndexerError, "prev_pos and next_pos cannot end with #{digits.first}"
56
+ raise Error, "prev_pos and next_pos cannot end with #{digits.first}"
61
57
  end
62
58
  end
63
59
  end
@@ -64,10 +64,6 @@ module FractionalIndexer
64
64
 
65
65
  private
66
66
 
67
- def digits
68
- FractionalIndexer.configuration.digits
69
- end
70
-
71
67
  def integer_digits(key = self.key)
72
68
  if self.class.positive?(key)
73
69
  key.ord - "a".ord + INTEGER_BASE_DIGIT
@@ -83,7 +79,7 @@ module FractionalIndexer
83
79
  end
84
80
 
85
81
  def raise_error(description = nil)
86
- raise FractionalIndexerError, "invalid order key: '#{key}' description: #{description}"
82
+ raise Error, "invalid order key: '#{key}' description: #{description}"
87
83
  end
88
84
 
89
85
  def minimum_integer
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FractionalIndexer
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.1"
5
5
  end
@@ -2,17 +2,21 @@
2
2
 
3
3
  require "fractional_indexer/version"
4
4
 
5
- module FractionalIndexer
6
- autoload :Configuration, "fractional_indexer/configuration"
7
- autoload :Decrementer, "fractional_indexer/decrementer"
8
- autoload :Incrementer, "fractional_indexer/incrementer"
9
- autoload :Midpointer, "fractional_indexer/midpointer"
10
- autoload :OrderKey, "fractional_indexer/order_key"
5
+ require "fractional_indexer/configuration"
6
+ require "fractional_indexer/decrementer"
7
+ require "fractional_indexer/incrementer"
8
+ require "fractional_indexer/midpointer"
9
+ require "fractional_indexer/order_key"
11
10
 
12
- class FractionalIndexerError < StandardError; end
11
+ module FractionalIndexer
12
+ class Error < StandardError; end
13
13
 
14
14
  @configuration = Configuration.new
15
15
 
16
+ [Decrementer, Incrementer, Midpointer, OrderKey].each do |klass|
17
+ klass.send(:define_method, :digits) { FractionalIndexer.configuration.digits }
18
+ end
19
+
16
20
  def self.configure
17
21
  yield(configuration) if block_given?
18
22
 
@@ -26,10 +30,10 @@ module FractionalIndexer
26
30
  def self.generate_key(prev_key: nil, next_key: nil)
27
31
  return OrderKey.zero if prev_key.nil? && next_key.nil?
28
32
 
29
- raise FractionalIndexerError, "prev_key and next_key cannot be empty" if prev_key&.empty? || next_key&.empty?
33
+ raise Error, "prev_key and next_key cannot be empty" if prev_key&.empty? || next_key&.empty?
30
34
 
31
35
  if !prev_key.nil? && !next_key.nil? && prev_key >= next_key
32
- raise FractionalIndexerError, "#{prev_key} is not less than #{next_key}"
36
+ raise Error, "#{prev_key} is not less than #{next_key}"
33
37
  end
34
38
 
35
39
  prev_order_key = OrderKey.new(prev_key)
@@ -50,6 +54,42 @@ module FractionalIndexer
50
54
  end
51
55
  end
52
56
 
57
+ def self.generate_keys(prev_key: nil, next_key: nil, count: 1)
58
+ return [] if count <= 0
59
+ return [generate_key(prev_key: prev_key, next_key: next_key)] if count == 1
60
+
61
+ if next_key.nil?
62
+ base_order_key = generate_key(prev_key: prev_key)
63
+ result = [base_order_key]
64
+
65
+ (count - 1).times do
66
+ result << generate_key(prev_key: result.last)
67
+ end
68
+
69
+ return result
70
+ end
71
+
72
+ if prev_key.nil?
73
+ base_order_key = generate_key(next_key: next_key)
74
+ result = [base_order_key]
75
+
76
+ (count - 1).times do
77
+ result << generate_key(next_key: result.last)
78
+ end
79
+
80
+ return result.reverse
81
+ end
82
+
83
+ mid = count / 2
84
+ base_order_key = generate_key(prev_key: prev_key, next_key: next_key)
85
+
86
+ [
87
+ *generate_keys(prev_key: prev_key, next_key: base_order_key, count: mid),
88
+ base_order_key,
89
+ *generate_keys(prev_key: base_order_key, next_key: next_key, count: count - mid - 1),
90
+ ]
91
+ end
92
+
53
93
  def self.decrement(order_key)
54
94
  return order_key.integer + Midpointer.execute("", order_key.fractional) if order_key.minimum_integer?
55
95
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fractional_indexer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - kazu