multi_range 0.0.3 → 0.0.4

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.
data/bin/setup CHANGED
@@ -1,8 +1,8 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install --gemfile=gemfiles/4.2.gemfile
7
-
8
- # Do any other automated setup that you need to do here
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install --gemfile=gemfiles/4.2.gemfile
7
+
8
+ # Do any other automated setup that you need to do here
@@ -1,9 +1,9 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in rails_or.gemspec
4
-
5
- group :test do
6
- gem 'simplecov'
7
- end
8
-
9
- gemspec :path => '../'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rails_or.gemspec
4
+
5
+ group :test do
6
+ gem 'simplecov'
7
+ end
8
+
9
+ gemspec :path => '../'
@@ -1,10 +1,10 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in rails_or.gemspec
4
-
5
- group :test do
6
- gem 'simplecov'
7
- gem 'minitest', '~> 5.11.3'
8
- end
9
-
10
- gemspec :path => '../'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rails_or.gemspec
4
+
5
+ group :test do
6
+ gem 'simplecov'
7
+ gem 'minitest', '~> 5.11.3'
8
+ end
9
+
10
+ gemspec :path => '../'
@@ -1,103 +1,125 @@
1
- require 'multi_range/version'
2
- require 'roulette-wheel-selection'
3
-
4
- if not Range.method_defined?(:size)
5
- warn "Please backports Range#size method to use multi_range gem.\n" \
6
- "You can use backports gem and add the following lines to your program:\n" \
7
- "require 'backports/1.9.2/float/infinity'\n" \
8
- "require 'backports/2.0.0/range/size'"
9
- end
10
-
11
- if not Enumerable.method_defined?(:to_h)
12
- warn "Please backports Enumerable#to_h method to use multi_range gem.\n" \
13
- "You can use backports gem and add the following lines to your program:\n" \
14
- "require 'backports/2.1.0/enumerable/to_h'"
15
- end
16
-
17
- class MultiRange
18
- INDEX_WITH_DEFAULT = Object.new
19
-
20
- attr_reader :ranges
21
-
22
- def initialize(ranges) # range 要由小到大排序,且各 range 不能重疊
23
- @ranges = ranges.map{|s| s.is_a?(Integer) ? s..s : s }.freeze
24
- end
25
-
26
- def -(other)
27
- new_ranges = @ranges.dup
28
-
29
- return MultiRange.new(new_ranges) if new_ranges.empty?
30
- return MultiRange.new(new_ranges) if other.min > @ranges.last.max # 大於最大值
31
- return MultiRange.new(new_ranges) if other.max < @ranges.first.min # 小於最小值
32
-
33
- changed_size = 0
34
- @ranges.each_with_index do |range, idx|
35
- next if other.min > range.max # 大於這個 range
36
- break if other.max < range.min # 小於這個 range
37
-
38
- sub_range1 = range.min...other.min
39
- sub_range2 = (other.max + 1)..range.max
40
-
41
- sub_ranges = []
42
- sub_ranges << sub_range1 if sub_range1.any?
43
- sub_ranges << sub_range2 if sub_range2.any?
44
-
45
- new_ranges[idx + changed_size, 1] = sub_ranges
46
- changed_size += sub_ranges.size - 1
47
- break if other.max <= range.max # 沒有超過一個 range 的範圍
48
- end
49
-
50
- return MultiRange.new(new_ranges)
51
- end
52
-
53
- def sample
54
- range = RouletteWheelSelection.sample(@ranges.map{|s| [s, s.size] }.to_h)
55
- return nil if range == nil
56
- return rand(range.max - range.min) + range.min
57
- end
58
-
59
- def size
60
- @ranges.inject(0){|sum, v| sum + v.size }
61
- end
62
-
63
- def any?
64
- @ranges.any?
65
- end
66
-
67
- def index_with(default = INDEX_WITH_DEFAULT)
68
- if block_given?
69
- fail ArgumentError, 'wrong number of arguments (given 1, expected 0)' if default != INDEX_WITH_DEFAULT
70
- return map{|s| [s, yield(s)] }.to_h
71
- end
72
-
73
- return to_enum(:index_with){ size } if default == INDEX_WITH_DEFAULT
74
- return map{|s| [s, default] }.to_h
75
- end
76
-
77
- def each
78
- return to_enum(:each){ size } if !block_given?
79
-
80
- ranges.each do |range|
81
- range.each{|s| yield(s) }
82
- end
83
- end
84
-
85
- def map
86
- return to_enum(:map){ size } if !block_given?
87
- return each.map{|s| yield(s) }
88
- end
89
-
90
- def to_a
91
- each.to_a
92
- end
93
-
94
- def min
95
- range = @ranges.first
96
- return range.min if range
97
- end
98
-
99
- def max
100
- range = @ranges.last
101
- return range.max if range
102
- end
103
- end
1
+ require 'multi_range/version'
2
+ require 'roulette-wheel-selection'
3
+
4
+ if not Range.method_defined?(:size)
5
+ warn "Please backports Range#size method to use multi_range gem.\n" \
6
+ "You can use backports gem and add the following lines to your program:\n" \
7
+ "require 'backports/1.9.2/float/infinity'\n" \
8
+ "require 'backports/2.0.0/range/size'"
9
+ end
10
+
11
+ if not Enumerable.method_defined?(:to_h)
12
+ warn "Please backports Enumerable#to_h method to use multi_range gem.\n" \
13
+ "You can use backports gem and add the following lines to your program:\n" \
14
+ "require 'backports/2.1.0/enumerable/to_h'"
15
+ end
16
+
17
+ class MultiRange
18
+ INDEX_WITH_DEFAULT = Object.new
19
+
20
+ attr_reader :ranges
21
+
22
+ def initialize(ranges) # range 要由小到大排序,且各 range 不能重疊
23
+ @ranges = ranges.map{|s| s.is_a?(Integer) ? s..s : s }.freeze
24
+ end
25
+
26
+ def flatten
27
+ return if @ranges.size == 0
28
+
29
+ new_ranges = []
30
+ current_range = nil
31
+
32
+ @ranges.each do |range|
33
+ next current_range = range if current_range == nil
34
+ next if range.max <= current_range.max
35
+
36
+ if current_range.max + 1 < range.min
37
+ new_ranges << current_range
38
+ current_range = range
39
+ else
40
+ current_range = current_range.min..range.max
41
+ end
42
+ end
43
+
44
+ new_ranges << current_range
45
+ return MultiRange.new(new_ranges)
46
+ end
47
+
48
+ def -(other)
49
+ new_ranges = @ranges.dup
50
+
51
+ return MultiRange.new(new_ranges) if new_ranges.empty?
52
+ return MultiRange.new(new_ranges) if other.min > @ranges.last.max # 大於最大值
53
+ return MultiRange.new(new_ranges) if other.max < @ranges.first.min # 小於最小值
54
+
55
+ changed_size = 0
56
+ @ranges.each_with_index do |range, idx|
57
+ next if other.min > range.max # 大於這個 range
58
+ break if other.max < range.min # 小於這個 range
59
+
60
+ sub_range1 = range.min...other.min
61
+ sub_range2 = (other.max + 1)..range.max
62
+
63
+ sub_ranges = []
64
+ sub_ranges << sub_range1 if sub_range1.any?
65
+ sub_ranges << sub_range2 if sub_range2.any?
66
+
67
+ new_ranges[idx + changed_size, 1] = sub_ranges
68
+ changed_size += sub_ranges.size - 1
69
+ break if other.max <= range.max # 沒有超過一個 range 的範圍
70
+ end
71
+
72
+ return MultiRange.new(new_ranges)
73
+ end
74
+
75
+ def sample
76
+ range = RouletteWheelSelection.sample(@ranges.map{|s| [s, s.size] }.to_h)
77
+ return nil if range == nil
78
+ return rand(range.max - range.min) + range.min
79
+ end
80
+
81
+ def size
82
+ @ranges.inject(0){|sum, v| sum + v.size }
83
+ end
84
+
85
+ def any?
86
+ @ranges.any?
87
+ end
88
+
89
+ def index_with(default = INDEX_WITH_DEFAULT)
90
+ if block_given?
91
+ fail ArgumentError, 'wrong number of arguments (given 1, expected 0)' if default != INDEX_WITH_DEFAULT
92
+ return map{|s| [s, yield(s)] }.to_h
93
+ end
94
+
95
+ return to_enum(:index_with){ size } if default == INDEX_WITH_DEFAULT
96
+ return map{|s| [s, default] }.to_h
97
+ end
98
+
99
+ def each
100
+ return to_enum(:each){ size } if !block_given?
101
+
102
+ ranges.each do |range|
103
+ range.each{|s| yield(s) }
104
+ end
105
+ end
106
+
107
+ def map
108
+ return to_enum(:map){ size } if !block_given?
109
+ return each.map{|s| yield(s) }
110
+ end
111
+
112
+ def to_a
113
+ each.to_a
114
+ end
115
+
116
+ def min
117
+ range = @ranges.first
118
+ return range.min if range
119
+ end
120
+
121
+ def max
122
+ range = @ranges.last
123
+ return range.max if range
124
+ end
125
+ end
@@ -1,3 +1,3 @@
1
- class MultiRange
2
- VERSION = '0.0.3'
3
- end
1
+ class MultiRange
2
+ VERSION = '0.0.4'
3
+ end
@@ -1,43 +1,43 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'multi_range/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = 'multi_range'
8
- spec.version = MultiRange::VERSION
9
- spec.authors = ['khiav reoy']
10
- spec.email = ['mrtmrt15xn@yahoo.com.tw']
11
-
12
- spec.summary = 'Provides cross-rails methods for you to upgrade rails, backport features, create easy-to-maintain gems, and so on.'
13
- spec.description = 'Provides cross-rails methods for you to upgrade rails, backport features, create easy-to-maintain gems, and so on.'
14
- spec.homepage = 'https://github.com/khiav223577/multi_range'
15
- spec.license = 'MIT'
16
-
17
- # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
18
- # delete this section to allow pushing this gem to any host.
19
- # if spec.respond_to?(:metadata)
20
- # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
21
- # else
22
- # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
23
- # end
24
-
25
- spec.files = `git ls-files -z`.split("\x0").reject{|f| f.match(%r{^(test|spec|features)/}) }
26
- spec.bindir = 'exe'
27
- spec.executables = spec.files.grep(%r{^exe/}){|f| File.basename(f) }
28
- spec.require_paths = ['lib']
29
- spec.metadata = {
30
- 'homepage_uri' => 'https://github.com/khiav223577/multi_range',
31
- 'changelog_uri' => 'https://github.com/khiav223577/multi_range/blob/master/CHANGELOG.md',
32
- 'source_code_uri' => 'https://github.com/khiav223577/multi_range',
33
- 'documentation_uri' => 'https://www.rubydoc.info/gems/multi_range',
34
- 'bug_tracker_uri' => 'https://github.com/khiav223577/multi_range/issues',
35
- }
36
-
37
- spec.add_development_dependency 'bundler', '>= 1.17', '< 3.x'
38
- spec.add_development_dependency 'rake', '>= 10.5.0'
39
- spec.add_development_dependency 'minitest', '~> 5.0'
40
- spec.add_development_dependency 'backports', '~> 3.15.0'
41
-
42
- spec.add_dependency 'roulette-wheel-selection', '~> 1.1.1'
43
- end
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'multi_range/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'multi_range'
8
+ spec.version = MultiRange::VERSION
9
+ spec.authors = ['khiav reoy']
10
+ spec.email = ['mrtmrt15xn@yahoo.com.tw']
11
+
12
+ spec.summary = 'Provides cross-rails methods for you to upgrade rails, backport features, create easy-to-maintain gems, and so on.'
13
+ spec.description = 'Provides cross-rails methods for you to upgrade rails, backport features, create easy-to-maintain gems, and so on.'
14
+ spec.homepage = 'https://github.com/khiav223577/multi_range'
15
+ spec.license = 'MIT'
16
+
17
+ # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
18
+ # delete this section to allow pushing this gem to any host.
19
+ # if spec.respond_to?(:metadata)
20
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
21
+ # else
22
+ # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
23
+ # end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject{|f| f.match(%r{^(test|spec|features)/}) }
26
+ spec.bindir = 'exe'
27
+ spec.executables = spec.files.grep(%r{^exe/}){|f| File.basename(f) }
28
+ spec.require_paths = ['lib']
29
+ spec.metadata = {
30
+ 'homepage_uri' => 'https://github.com/khiav223577/multi_range',
31
+ 'changelog_uri' => 'https://github.com/khiav223577/multi_range/blob/master/CHANGELOG.md',
32
+ 'source_code_uri' => 'https://github.com/khiav223577/multi_range',
33
+ 'documentation_uri' => 'https://www.rubydoc.info/gems/multi_range',
34
+ 'bug_tracker_uri' => 'https://github.com/khiav223577/multi_range/issues',
35
+ }
36
+
37
+ spec.add_development_dependency 'bundler', '>= 1.17', '< 3.x'
38
+ spec.add_development_dependency 'rake', '>= 10.5.0'
39
+ spec.add_development_dependency 'minitest', '~> 5.0'
40
+ spec.add_development_dependency 'backports', '~> 3.15.0'
41
+
42
+ spec.add_dependency 'roulette-wheel-selection', '~> 1.1.1'
43
+ end
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.3
4
+ version: 0.0.4
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-03-02 00:00:00.000000000 Z
11
+ date: 2020-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -133,7 +133,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
133
  - !ruby/object:Gem::Version
134
134
  version: '0'
135
135
  requirements: []
136
- rubygems_version: 3.0.3
136
+ rubyforge_project:
137
+ rubygems_version: 2.6.14
137
138
  signing_key:
138
139
  specification_version: 4
139
140
  summary: Provides cross-rails methods for you to upgrade rails, backport features,