multi_range 1.1.0 → 1.2.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 +4 -4
 - data/CHANGELOG.md +3 -0
 - data/README.md +9 -5
 - data/lib/multi_range.rb +26 -15
 - data/lib/multi_range/version.rb +1 -1
 - data/multi_range.gemspec +2 -2
 - metadata +6 -6
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 9dce52f266fe1dd26eaccbac184ee8c1ed5cc160322d92ded5471fb3efda0ee4
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: d001904ffda1cf620638042afd72da56b1b810b457df6227bd1d9fb3e7986a4e
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 36fb852c41b4802589fd950b3beadbccad986e8e5e31da5993acfd11e19339e7034eba7099bcd36903e74e592c397e4501682cae47f482c74ad9d86d136b25cc
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 0a763c262c12b7b45fc0c47f50bbbee929a19c2399e9e9725f70d49222bcdf1d0860c8b1162d8a04e2f2b992e42287b2deacbbf6dbf9c051f98c3fad04ec0488
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,5 +1,8 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ## Change Log
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            ### [v1.1.0](https://github.com/khiav223577/multi_range/compare/v1.0.0...v1.1.0) 2020/10/15
         
     | 
| 
      
 4 
     | 
    
         
            +
            - [#13](https://github.com/khiav223577/multi_range/pull/13) Rename flatten => merge_overlaps (@khiav223577)
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
       3 
6 
     | 
    
         
             
            ### [v1.0.0](https://github.com/khiav223577/multi_range/compare/v0.0.4...v1.0.0) 2020/10/15
         
     | 
| 
       4 
7 
     | 
    
         
             
            - [#12](https://github.com/khiav223577/multi_range/pull/12) Implement #overlaps? (@khiav223577)
         
     | 
| 
       5 
8 
     | 
    
         
             
            - [#11](https://github.com/khiav223577/multi_range/pull/11) Support difference other multi_range object (@khiav223577)
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -25,7 +25,7 @@ Or install it yourself as: 
     | 
|
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
            ## Usage
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
            Allow you to manipulate a group of ranges.
         
     | 
| 
      
 28 
     | 
    
         
            +
            Allow you to manipulate a group of ranges. Such as merging overlapping ranges, doing ranges union and difference.
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
       30 
30 
     | 
    
         
             
            ### Sample a number
         
     | 
| 
       31 
31 
     | 
    
         
             
            ```rb
         
     | 
| 
         @@ -34,7 +34,7 @@ multi_range.sample 
     | 
|
| 
       34 
34 
     | 
    
         
             
            # => equals to [1, 2, 3, 4, 5, 10, 11, 12].sample
         
     | 
| 
       35 
35 
     | 
    
         
             
            ```
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
            ###  
     | 
| 
      
 37 
     | 
    
         
            +
            ### Difference of ranges
         
     | 
| 
       38 
38 
     | 
    
         
             
            ```rb
         
     | 
| 
       39 
39 
     | 
    
         
             
            multi_range = MultiRange.new([1..10])
         
     | 
| 
       40 
40 
     | 
    
         
             
            multi_range -= 5..7
         
     | 
| 
         @@ -56,7 +56,7 @@ multi_range.ranges 
     | 
|
| 
       56 
56 
     | 
    
         
             
            # => [1...5, 61..70, 86..100] 
         
     | 
| 
       57 
57 
     | 
    
         
             
            ```
         
     | 
| 
       58 
58 
     | 
    
         | 
| 
       59 
     | 
    
         
            -
            ###  
     | 
| 
      
 59 
     | 
    
         
            +
            ### Union ranges
         
     | 
| 
       60 
60 
     | 
    
         | 
| 
       61 
61 
     | 
    
         
             
            ```rb
         
     | 
| 
       62 
62 
     | 
    
         
             
            multi_range = MultiRange.new([1..5])
         
     | 
| 
         @@ -72,14 +72,18 @@ multi_range.ranges 
     | 
|
| 
       72 
72 
     | 
    
         
             
            # => [1..6, 10..25, 30..30]
         
     | 
| 
       73 
73 
     | 
    
         
             
            ```
         
     | 
| 
       74 
74 
     | 
    
         | 
| 
       75 
     | 
    
         
            -
            ###  
     | 
| 
      
 75 
     | 
    
         
            +
            ### Merge overlaps
         
     | 
| 
       76 
76 
     | 
    
         
             
            ```rb
         
     | 
| 
       77 
77 
     | 
    
         
             
            multi_range = MultiRange.new([1, 2, 4..6, 7, 8..12])
         
     | 
| 
       78 
78 
     | 
    
         
             
            multi_range.merge_overlaps.ranges
         
     | 
| 
       79 
79 
     | 
    
         
             
            # => [1..2, 4..12]
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
            multi_range = MultiRange.new([1.2..1.5, 1.7..1.9, 1.8..2.2])
         
     | 
| 
      
 82 
     | 
    
         
            +
            multi_range.merge_overlaps.ranges
         
     | 
| 
      
 83 
     | 
    
         
            +
            # => [1.2..1.5, 1.7..2.2]
         
     | 
| 
       80 
84 
     | 
    
         
             
            ```
         
     | 
| 
       81 
85 
     | 
    
         | 
| 
       82 
     | 
    
         
            -
            ###  
     | 
| 
      
 86 
     | 
    
         
            +
            ### Check if it overlaps with the other
         
     | 
| 
       83 
87 
     | 
    
         | 
| 
       84 
88 
     | 
    
         
             
            ```rb
         
     | 
| 
       85 
89 
     | 
    
         
             
            multi_range = MultiRange.new([1..5, 10..15, 20..25])
         
     | 
    
        data/lib/multi_range.rb
    CHANGED
    
    | 
         @@ -22,7 +22,8 @@ class MultiRange 
     | 
|
| 
       22 
22 
     | 
    
         
             
              attr_reader :ranges
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
24 
     | 
    
         
             
              def initialize(ranges)
         
     | 
| 
       25 
     | 
    
         
            -
                @ranges = ranges.map{|s| s.is_a?( 
     | 
| 
      
 25 
     | 
    
         
            +
                @ranges = ranges.map{|s| s.is_a?(Numeric) ? s..s : s }.sort_by(&:begin).freeze
         
     | 
| 
      
 26 
     | 
    
         
            +
                @is_float = @ranges.any?{|range| range.begin.is_a?(Float) || range.end.is_a?(Float) }
         
     | 
| 
       26 
27 
     | 
    
         
             
              end
         
     | 
| 
       27 
28 
     | 
    
         | 
| 
       28 
29 
     | 
    
         
             
              def merge_overlaps
         
     | 
| 
         @@ -33,13 +34,13 @@ class MultiRange 
     | 
|
| 
       33 
34 
     | 
    
         | 
| 
       34 
35 
     | 
    
         
             
                @ranges.each do |range|
         
     | 
| 
       35 
36 
     | 
    
         
             
                  next current_range = range if current_range == nil
         
     | 
| 
       36 
     | 
    
         
            -
                  next if range. 
     | 
| 
      
 37 
     | 
    
         
            +
                  next if range.end <= current_range.end
         
     | 
| 
       37 
38 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
                  if current_range 
     | 
| 
      
 39 
     | 
    
         
            +
                  if can_combine?(current_range, range)
         
     | 
| 
      
 40 
     | 
    
         
            +
                    current_range = range.exclude_end? ? current_range.begin...range.end : current_range.begin..range.end
         
     | 
| 
      
 41 
     | 
    
         
            +
                  else
         
     | 
| 
       39 
42 
     | 
    
         
             
                    new_ranges << current_range
         
     | 
| 
       40 
43 
     | 
    
         
             
                    current_range = range
         
     | 
| 
       41 
     | 
    
         
            -
                  else
         
     | 
| 
       42 
     | 
    
         
            -
                    current_range = current_range.min..range.max
         
     | 
| 
       43 
44 
     | 
    
         
             
                  end
         
     | 
| 
       44 
45 
     | 
    
         
             
                end
         
     | 
| 
       45 
46 
     | 
    
         | 
| 
         @@ -57,24 +58,26 @@ class MultiRange 
     | 
|
| 
       57 
58 
     | 
    
         
             
                new_ranges = @ranges.dup
         
     | 
| 
       58 
59 
     | 
    
         | 
| 
       59 
60 
     | 
    
         
             
                return MultiRange.new(new_ranges) if new_ranges.empty?
         
     | 
| 
       60 
     | 
    
         
            -
                return MultiRange.new(new_ranges) if other. 
     | 
| 
       61 
     | 
    
         
            -
                return MultiRange.new(new_ranges) if other. 
     | 
| 
      
 61 
     | 
    
         
            +
                return MultiRange.new(new_ranges) if other.begin > @ranges.last.end # 大於最大值
         
     | 
| 
      
 62 
     | 
    
         
            +
                return MultiRange.new(new_ranges) if other.end < @ranges.first.begin # 小於最小值
         
     | 
| 
       62 
63 
     | 
    
         | 
| 
       63 
64 
     | 
    
         
             
                changed_size = 0
         
     | 
| 
       64 
65 
     | 
    
         
             
                @ranges.each_with_index do |range, idx|
         
     | 
| 
       65 
     | 
    
         
            -
                  next if other. 
     | 
| 
       66 
     | 
    
         
            -
                  break if other. 
     | 
| 
      
 66 
     | 
    
         
            +
                  next if other.begin > range.end # 大於這個 range
         
     | 
| 
      
 67 
     | 
    
         
            +
                  break if other.end < range.begin # 小於這個 range
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                  sub_range1 = range.begin...other.begin
         
     | 
| 
       67 
70 
     | 
    
         | 
| 
       68 
     | 
    
         
            -
                   
     | 
| 
       69 
     | 
    
         
            -
                  sub_range2 =  
     | 
| 
      
 71 
     | 
    
         
            +
                  sub_range2_begin = other.exclude_end? ? other.end : other.end + (other.end.is_a?(Float) ? Float::EPSILON : 1)
         
     | 
| 
      
 72 
     | 
    
         
            +
                  sub_range2 = range.exclude_end? ? sub_range2_begin...range.end : sub_range2_begin..range.end
         
     | 
| 
       70 
73 
     | 
    
         | 
| 
       71 
74 
     | 
    
         
             
                  sub_ranges = []
         
     | 
| 
       72 
     | 
    
         
            -
                  sub_ranges << sub_range1 if sub_range1. 
     | 
| 
       73 
     | 
    
         
            -
                  sub_ranges << sub_range2 if sub_range2. 
     | 
| 
      
 75 
     | 
    
         
            +
                  sub_ranges << sub_range1 if sub_range1.begin <= sub_range1.end
         
     | 
| 
      
 76 
     | 
    
         
            +
                  sub_ranges << sub_range2 if sub_range2.begin <= sub_range2.end
         
     | 
| 
       74 
77 
     | 
    
         | 
| 
       75 
78 
     | 
    
         
             
                  new_ranges[idx + changed_size, 1] = sub_ranges
         
     | 
| 
       76 
79 
     | 
    
         
             
                  changed_size += sub_ranges.size - 1
         
     | 
| 
       77 
     | 
    
         
            -
                  break if other. 
     | 
| 
      
 80 
     | 
    
         
            +
                  break if other.end <= range.end # 沒有超過一個 range 的範圍
         
     | 
| 
       78 
81 
     | 
    
         
             
                end
         
     | 
| 
       79 
82 
     | 
    
         | 
| 
       80 
83 
     | 
    
         
             
                return MultiRange.new(new_ranges)
         
     | 
| 
         @@ -87,7 +90,7 @@ class MultiRange 
     | 
|
| 
       87 
90 
     | 
    
         | 
| 
       88 
91 
     | 
    
         
             
              def overlaps?(other)
         
     | 
| 
       89 
92 
     | 
    
         
             
                multi_range = merge_overlaps
         
     | 
| 
       90 
     | 
    
         
            -
                return multi_range. 
     | 
| 
      
 93 
     | 
    
         
            +
                return multi_range.ranges != (multi_range - other).ranges
         
     | 
| 
       91 
94 
     | 
    
         
             
              end
         
     | 
| 
       92 
95 
     | 
    
         | 
| 
       93 
96 
     | 
    
         
             
              def sample
         
     | 
| 
         @@ -140,4 +143,12 @@ class MultiRange 
     | 
|
| 
       140 
143 
     | 
    
         
             
                range = @ranges.last
         
     | 
| 
       141 
144 
     | 
    
         
             
                return range.max if range
         
     | 
| 
       142 
145 
     | 
    
         
             
              end
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
              private
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
              # make sure that range1.begin <= range2.begin
         
     | 
| 
      
 150 
     | 
    
         
            +
              def can_combine?(range1, range2)
         
     | 
| 
      
 151 
     | 
    
         
            +
                return range1.end >= range2.begin if @is_float
         
     | 
| 
      
 152 
     | 
    
         
            +
                return range1.end + 1 >= range2.begin
         
     | 
| 
      
 153 
     | 
    
         
            +
              end
         
     | 
| 
       143 
154 
     | 
    
         
             
            end
         
     | 
    
        data/lib/multi_range/version.rb
    CHANGED
    
    
    
        data/multi_range.gemspec
    CHANGED
    
    | 
         @@ -9,8 +9,8 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       9 
9 
     | 
    
         
             
              spec.authors       = ['khiav reoy']
         
     | 
| 
       10 
10 
     | 
    
         
             
              spec.email         = ['mrtmrt15xn@yahoo.com.tw']
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
              spec.summary       = ' 
     | 
| 
       13 
     | 
    
         
            -
              spec.description   = ' 
     | 
| 
      
 12 
     | 
    
         
            +
              spec.summary       = 'Allow you to manipulate a group of ranges. Such as merging overlapping ranges, doing ranges union and difference.'
         
     | 
| 
      
 13 
     | 
    
         
            +
              spec.description   = 'Allow you to manipulate a group of ranges. Such as merging overlapping ranges, doing ranges union and difference.'
         
     | 
| 
       14 
14 
     | 
    
         
             
              spec.homepage      = 'https://github.com/khiav223577/multi_range'
         
     | 
| 
       15 
15 
     | 
    
         
             
              spec.license       = 'MIT'
         
     | 
| 
       16 
16 
     | 
    
         | 
    
        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: 1. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.2.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-10- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2020-10-16 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: bundler
         
     | 
| 
         @@ -86,8 +86,8 @@ dependencies: 
     | 
|
| 
       86 
86 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       87 
87 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       88 
88 
     | 
    
         
             
                    version: 1.1.1
         
     | 
| 
       89 
     | 
    
         
            -
            description:  
     | 
| 
       90 
     | 
    
         
            -
               
     | 
| 
      
 89 
     | 
    
         
            +
            description: Allow you to manipulate a group of ranges. Such as merging overlapping
         
     | 
| 
      
 90 
     | 
    
         
            +
              ranges, doing ranges union and difference.
         
     | 
| 
       91 
91 
     | 
    
         
             
            email:
         
     | 
| 
       92 
92 
     | 
    
         
             
            - mrtmrt15xn@yahoo.com.tw
         
     | 
| 
       93 
93 
     | 
    
         
             
            executables: []
         
     | 
| 
         @@ -136,6 +136,6 @@ requirements: [] 
     | 
|
| 
       136 
136 
     | 
    
         
             
            rubygems_version: 3.0.3
         
     | 
| 
       137 
137 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       138 
138 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       139 
     | 
    
         
            -
            summary:  
     | 
| 
       140 
     | 
    
         
            -
               
     | 
| 
      
 139 
     | 
    
         
            +
            summary: Allow you to manipulate a group of ranges. Such as merging overlapping ranges,
         
     | 
| 
      
 140 
     | 
    
         
            +
              doing ranges union and difference.
         
     | 
| 
       141 
141 
     | 
    
         
             
            test_files: []
         
     |