multi_range 0.0.1 → 0.0.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
  SHA256:
3
- metadata.gz: bc888fe565efb5be6e3f5167cb8ba3fbba7af15a9c3980dada5c602d4d2023c1
4
- data.tar.gz: 77412a6767bc130615b26b828aef0148fe1026d64a1bb305d8d1014ccabf4af9
3
+ metadata.gz: a51f5f8289e43754c02b2b3decfc55795c4f69ee43cf8acca25738167545c1e2
4
+ data.tar.gz: 11fec578c3d1f84d86085444eb876256dddbf352cd46958d21d1155f66b900a1
5
5
  SHA512:
6
- metadata.gz: 1181abb70fa282197b3c3f98159160711428ae4f8284b74910e23f2e56acb79d304029c3cc4ba4c021e811ef9a8019361117f3aa04004036ba4cd8e0a28a7552
7
- data.tar.gz: e748cf07d90d7fd4cb67397c690c9fb58bd8c4a7561f0b82b98b25f1894fb44badf1d9ff4f0838d9223c739ec01d0dee67aea17eb4c0beb2ea01e51e2efc46d0
6
+ metadata.gz: 765a78073272b2b1fed76f2ddf0ba5ad968bba263aa1c06c36bd16412b87b3a5296cb5522b7b2226740ba45b7ac15028de802cc73c388f4ba6497a1f76219ad3
7
+ data.tar.gz: e3e7c19484f4b4532e39ece23d9ea1b7af6b8ea505ae5fd0a503177429370549fe3f531cf4e0575830d9de688fe9980872615bd5e71645b03e64689789abeceb
data/CHANGELOG.md CHANGED
@@ -1 +1,5 @@
1
- ## Change Log
1
+ ## Change Log
2
+
3
+ ### v0.0.1 2020/03/01
4
+ - [#2](https://github.com/khiav223577/multi_range/pull/2) Support Ruby 1.8.7 (@khiav223577)
5
+ - [#1](https://github.com/khiav223577/multi_range/pull/1) Implement MultiRange (@khiav223577)
data/README.md CHANGED
@@ -8,12 +8,9 @@
8
8
 
9
9
  ## Supports
10
10
  - Ruby 1.8 ~ 2.7
11
- - Rails 3.2, 4.2, 5.0, 5.1, 5.2, 6.0
12
11
 
13
12
  ## Installation
14
13
 
15
- Provides cross-rails methods for you to upgrade rails, backport features, create easy-to-maintain gems, and so on.
16
-
17
14
  ```ruby
18
15
  gem 'multi_range'
19
16
  ```
@@ -28,6 +25,50 @@ Or install it yourself as:
28
25
 
29
26
  ## Usage
30
27
 
28
+ Allow you to manipulate a group of ranges.
29
+
30
+ ### Sample a number
31
+ ```rb
32
+ multi_range = MultiRange.new([1..5, 10..12])
33
+ multi_range.sample
34
+ # => equals to [1, 2, 3, 4, 5, 10, 11, 12].sample
35
+ ```
36
+
37
+ ### Range difference
38
+ ```rb
39
+ multi_range = MultiRange.new([1..10])
40
+ multi_range -= 5..7
41
+ multi_range.ranges
42
+ # => [1...5, 8..10]
43
+ ```
44
+
45
+ ```rb
46
+ multi_range = MultiRange.new([1..10, 50..70, 80..100])
47
+ multi_range -= 5..85
48
+ multi_range.ranges
49
+ # => [1...5, 86..100]
50
+ ```
51
+
52
+ ### Range-like interface
53
+
54
+ #### each
55
+ ```rb
56
+ MultiRange([1..3, 5..6]).each{|s| print s }
57
+ # => 12356
58
+ ```
59
+
60
+ #### map
61
+ ```rb
62
+ MultiRange([1..3, 5..6]).map{|s| s * 2 }
63
+ # => [2, 4, 6, 10, 12]
64
+ ```
65
+
66
+ #### index_with
67
+ ```rb
68
+ MultiRange([1..3, 5..6]).index_with(true)
69
+ # => { 1 => true, 2 => true, 3 => true, 5 => true, 6 => true }
70
+ ```
71
+
31
72
 
32
73
  ## Development
33
74
 
@@ -1,3 +1,3 @@
1
1
  class MultiRange
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
data/lib/multi_range.rb CHANGED
@@ -15,10 +15,12 @@ if not Enumerable.method_defined?(:to_h)
15
15
  end
16
16
 
17
17
  class MultiRange
18
+ INDEX_WITH_DEFAULT = Object.new
19
+
18
20
  attr_reader :ranges
19
21
 
20
22
  def initialize(ranges) # range 要由小到大排序,且各 range 不能重疊
21
- @ranges = ranges
23
+ @ranges = ranges.map{|s| s.is_a?(Integer) ? s..s : s }
22
24
  end
23
25
 
24
26
  def -(other)
@@ -61,4 +63,27 @@ class MultiRange
61
63
  def any?
62
64
  @ranges.any?
63
65
  end
66
+
67
+ def index_with(default = INDEX_WITH_DEFAULT)
68
+ if block_given?
69
+ fail ArgumentError.new('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
64
89
  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.1
4
+ version: 0.0.2
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-01 00:00:00.000000000 Z
11
+ date: 2020-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler