multi_range 0.0.4 → 1.0.0
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 +5 -5
- data/.rubocop.yml +5 -6
- data/CHANGELOG.md +3 -0
- data/README.md +87 -0
- data/lib/multi_range.rb +21 -3
- data/lib/multi_range/version.rb +3 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 82aa8d60271246bff1316449278536578153d944fd33bb8c1247175c055d98c4
|
4
|
+
data.tar.gz: bac913e6497fc532f69a5a4dfca6066b9856b5ab82f80279a9d3669013a5620d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 99c502e9fb9998ef235af41f696cdb41cdfb0559ed4431baff0b28e4873564c1c44e60c86638a7f72ff3f1f247b41effb807defb83aa1c91ed56225ff46f70f4
|
7
|
+
data.tar.gz: 4804d00e47dbaec3c2f1a5013489fcd4a4a2f86204419176676b7c11e88c4fa9114c9f13956ad8c2e491a05619813af2f1de923eb334edec2b0a370a145d55a1
|
data/.rubocop.yml
CHANGED
@@ -76,10 +76,6 @@ Layout/EndAlignment:
|
|
76
76
|
Description: 'Align ends correctly.'
|
77
77
|
Enabled: true
|
78
78
|
|
79
|
-
Lint/EndInMethod:
|
80
|
-
Description: 'END blocks should not be placed inside method definitions.'
|
81
|
-
Enabled: true
|
82
|
-
|
83
79
|
Lint/EnsureReturn:
|
84
80
|
Description: 'Do not use return in an ensure block.'
|
85
81
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-return-ensure'
|
@@ -581,9 +577,12 @@ Style/For:
|
|
581
577
|
Style/FormatString:
|
582
578
|
Description: 'Enforce the use of Kernel#sprintf, Kernel#format or String#%.'
|
583
579
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#sprintf'
|
584
|
-
EnforcedStyle:
|
580
|
+
EnforcedStyle: percent
|
585
581
|
Enabled: true
|
586
582
|
|
583
|
+
Style/FormatStringToken:
|
584
|
+
Enabled: false
|
585
|
+
|
587
586
|
Style/GlobalVars:
|
588
587
|
Description: 'Do not introduce global variables.'
|
589
588
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#instance-vars'
|
@@ -809,7 +808,7 @@ Style/PercentQLiterals:
|
|
809
808
|
Style/PerlBackrefs:
|
810
809
|
Description: 'Avoid Perl-style regex back references.'
|
811
810
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-perl-regexp-last-matchers'
|
812
|
-
Enabled:
|
811
|
+
Enabled: false
|
813
812
|
|
814
813
|
Naming/PredicateName:
|
815
814
|
Description: 'Check the names of predicate methods.'
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
## Change Log
|
2
2
|
|
3
|
+
### [v0.0.4](https://github.com/khiav223577/multi_range/compare/v0.0.3...v0.0.4) 2020/03/26
|
4
|
+
- [#7](https://github.com/khiav223577/multi_range/pull/7) Add flatten method (@khiav223577)
|
5
|
+
|
3
6
|
### [v0.0.3](https://github.com/khiav223577/multi_range/compare/v0.0.2...v0.0.3) 2020/03/02
|
4
7
|
- [#6](https://github.com/khiav223577/multi_range/pull/6) freeze internal ranges variable (@khiav223577)
|
5
8
|
- [#5](https://github.com/khiav223577/multi_range/pull/5) Add min, max, to_a method (@khiav223577)
|
data/README.md
CHANGED
@@ -49,6 +49,29 @@ multi_range.ranges
|
|
49
49
|
# => [1...5, 86..100]
|
50
50
|
```
|
51
51
|
|
52
|
+
```rb
|
53
|
+
multi_range = MultiRange.new([1..10, 50..70, 80..100])
|
54
|
+
multi_range -= MultiRange.new([5..60, 75..85])
|
55
|
+
multi_range.ranges
|
56
|
+
# => [1...5, 61..70, 86..100]
|
57
|
+
```
|
58
|
+
|
59
|
+
### Range union
|
60
|
+
|
61
|
+
```rb
|
62
|
+
multi_range = MultiRange.new([1..5])
|
63
|
+
multi_range |= 3..8
|
64
|
+
multi_range.ranges
|
65
|
+
# => [1..8]
|
66
|
+
```
|
67
|
+
|
68
|
+
```rb
|
69
|
+
multi_range = MultiRange.new([1..5, 10..15, 20..25])
|
70
|
+
multi_range |= MultiRange.new([3..6, 14..22, 30])
|
71
|
+
multi_range.ranges
|
72
|
+
# => [1..6, 10..25, 30..30]
|
73
|
+
```
|
74
|
+
|
52
75
|
### Flatten
|
53
76
|
```rb
|
54
77
|
multi_range = MultiRange.new([1, 2, 4..6, 7, 8..12])
|
@@ -56,6 +79,26 @@ multi_range.flatten.ranges
|
|
56
79
|
# => [1..2, 4..12]
|
57
80
|
```
|
58
81
|
|
82
|
+
### Overlaps?
|
83
|
+
|
84
|
+
```rb
|
85
|
+
multi_range = MultiRange.new([1..5, 10..15, 20..25])
|
86
|
+
multi_range.overlaps?(7..8)
|
87
|
+
# => false
|
88
|
+
|
89
|
+
multi_range.overlaps?(3..8)
|
90
|
+
# => true
|
91
|
+
|
92
|
+
multi_range.overlaps?(7..12)
|
93
|
+
# => true
|
94
|
+
```
|
95
|
+
|
96
|
+
```rb
|
97
|
+
multi_range = MultiRange.new([1..5, 10..15, 20..25])
|
98
|
+
multi_range.overlaps?(MultiRange.new([6..8, 18..22]))
|
99
|
+
# => true
|
100
|
+
```
|
101
|
+
|
59
102
|
### Range-like interface
|
60
103
|
|
61
104
|
#### each
|
@@ -94,6 +137,50 @@ MultiRange.new([1..3, 6, 8..9]).to_a
|
|
94
137
|
# => [1, 2, 3, 6, 8, 9]
|
95
138
|
```
|
96
139
|
|
140
|
+
|
141
|
+
#### size
|
142
|
+
```rb
|
143
|
+
MultiRange.new([1..3, 6, 8..9]).size
|
144
|
+
# => 6
|
145
|
+
```
|
146
|
+
|
147
|
+
### Warning
|
148
|
+
|
149
|
+
The return value may be different when there are some overlapped ranges.
|
150
|
+
Call `flatten` if you want to merge overlapped ranges.
|
151
|
+
|
152
|
+
```rb
|
153
|
+
MultiRange.new([1..5, 3..6]).to_a
|
154
|
+
# => [1, 2, 3, 4, 5, 3, 4, 5, 6]
|
155
|
+
|
156
|
+
MultiRange.new([1..5, 3..6]).flatten.to_a
|
157
|
+
# => [1, 2, 3, 4, 5, 6]
|
158
|
+
```
|
159
|
+
|
160
|
+
```rb
|
161
|
+
MultiRange.new([1..5, 3..6]).each{|s| print s }
|
162
|
+
# => 123453456
|
163
|
+
|
164
|
+
MultiRange.new([1..5, 3..6]).flatten.each{|s| print s }
|
165
|
+
# => 123456
|
166
|
+
```
|
167
|
+
|
168
|
+
```rb
|
169
|
+
MultiRange.new([1..5, 3..6]).map{|s| s * 2 }
|
170
|
+
# => [2, 4, 6, 8, 10, 6, 8, 10, 12]
|
171
|
+
|
172
|
+
MultiRange.new([1..5, 3..6]).flatten.map{|s| s * 2 }
|
173
|
+
# => [2, 4, 6, 8, 10, 12]
|
174
|
+
```
|
175
|
+
|
176
|
+
```rb
|
177
|
+
MultiRange.new([1..5, 3..6]).size
|
178
|
+
# => 9
|
179
|
+
|
180
|
+
MultiRange.new([1..5, 3..6]).flatten.size
|
181
|
+
# => 6
|
182
|
+
```
|
183
|
+
|
97
184
|
## Development
|
98
185
|
|
99
186
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/multi_range.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'multi_range/version'
|
2
4
|
require 'roulette-wheel-selection'
|
3
5
|
|
@@ -19,12 +21,12 @@ class MultiRange
|
|
19
21
|
|
20
22
|
attr_reader :ranges
|
21
23
|
|
22
|
-
def initialize(ranges)
|
23
|
-
@ranges = ranges.map{|s| s.is_a?(Integer) ? s..s : s }.freeze
|
24
|
+
def initialize(ranges)
|
25
|
+
@ranges = ranges.map{|s| s.is_a?(Integer) ? s..s : s }.sort_by(&:begin).freeze
|
24
26
|
end
|
25
27
|
|
26
28
|
def flatten
|
27
|
-
return if @ranges.size == 0
|
29
|
+
return MultiRange.new([]) if @ranges.size == 0
|
28
30
|
|
29
31
|
new_ranges = []
|
30
32
|
current_range = nil
|
@@ -46,6 +48,12 @@ class MultiRange
|
|
46
48
|
end
|
47
49
|
|
48
50
|
def -(other)
|
51
|
+
if other.is_a?(MultiRange)
|
52
|
+
new_multi_range = dup
|
53
|
+
other.ranges.each{|range| new_multi_range -= range }
|
54
|
+
return new_multi_range
|
55
|
+
end
|
56
|
+
|
49
57
|
new_ranges = @ranges.dup
|
50
58
|
|
51
59
|
return MultiRange.new(new_ranges) if new_ranges.empty?
|
@@ -72,6 +80,16 @@ class MultiRange
|
|
72
80
|
return MultiRange.new(new_ranges)
|
73
81
|
end
|
74
82
|
|
83
|
+
def |(other)
|
84
|
+
other_ranges = other.is_a?(MultiRange) ? other.ranges : [other]
|
85
|
+
return MultiRange.new(@ranges + other_ranges).flatten
|
86
|
+
end
|
87
|
+
|
88
|
+
def overlaps?(other)
|
89
|
+
multi_range = flatten
|
90
|
+
return multi_range.size != (multi_range - other).size
|
91
|
+
end
|
92
|
+
|
75
93
|
def sample
|
76
94
|
range = RouletteWheelSelection.sample(@ranges.map{|s| [s, s.size] }.to_h)
|
77
95
|
return nil if range == nil
|
data/lib/multi_range/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multi_range
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- khiav reoy
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -133,8 +133,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
133
|
- !ruby/object:Gem::Version
|
134
134
|
version: '0'
|
135
135
|
requirements: []
|
136
|
-
|
137
|
-
rubygems_version: 2.6.14
|
136
|
+
rubygems_version: 3.0.3
|
138
137
|
signing_key:
|
139
138
|
specification_version: 4
|
140
139
|
summary: Provides cross-rails methods for you to upgrade rails, backport features,
|