{"id":15632201,"url":"https://github.com/khiav223577/multi_range","last_synced_at":"2025-07-09T20:32:23.220Z","repository":{"id":48086765,"uuid":"244186581","full_name":"khiav223577/multi_range","owner":"khiav223577","description":"Allow you to manipulate a group of ranges. Such as merging overlapping ranges, doing ranges union, intersection, difference, and so on.","archived":false,"fork":false,"pushed_at":"2024-09-14T18:06:22.000Z","size":139,"stargazers_count":19,"open_issues_count":4,"forks_count":2,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-06-19T06:17:40.035Z","etag":null,"topics":["gem","ranges"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/khiav223577.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-03-01T16:47:51.000Z","updated_at":"2024-09-14T18:06:26.000Z","dependencies_parsed_at":"2022-08-12T18:20:26.468Z","dependency_job_id":"2aa4d1f0-e408-4a8d-9f28-b4c5b05afd02","html_url":"https://github.com/khiav223577/multi_range","commit_stats":{"total_commits":155,"total_committers":6,"mean_commits":"25.833333333333332","dds":0.1806451612903226,"last_synced_commit":"ccae1e6f32be272bf12fe6b6c168184052802753"},"previous_names":[],"tags_count":17,"template":false,"template_full_name":"khiav223577/gem_template","purl":"pkg:github/khiav223577/multi_range","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khiav223577%2Fmulti_range","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khiav223577%2Fmulti_range/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khiav223577%2Fmulti_range/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khiav223577%2Fmulti_range/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/khiav223577","download_url":"https://codeload.github.com/khiav223577/multi_range/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khiav223577%2Fmulti_range/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264502649,"owners_count":23618663,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gem","ranges"],"created_at":"2024-10-03T10:42:59.411Z","updated_at":"2025-07-09T20:32:23.181Z","avatar_url":"https://github.com/khiav223577.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MultiRange\n\n[![Gem Version](https://img.shields.io/gem/v/multi_range.svg?style=flat)](http://rubygems.org/gems/multi_range)\n[![Build Status](https://github.com/khiav223577/multi_range/workflows/Ruby/badge.svg)](https://github.com/khiav223577/multi_range/actions)\n[![RubyGems](http://img.shields.io/gem/dt/multi_range.svg?style=flat)](http://rubygems.org/gems/multi_range)\n[![Code Climate](https://codeclimate.com/github/khiav223577/multi_range/badges/gpa.svg)](https://codeclimate.com/github/khiav223577/multi_range)\n[![Test Coverage](https://codeclimate.com/github/khiav223577/multi_range/badges/coverage.svg)](https://codeclimate.com/github/khiav223577/multi_range/coverage)\n\n## Supports\n \n- Ruby 2.3 ~ 2.7\n  - For Ruby 1.8.x and 1.9.x, please use multi_range \u003c v2.0.0\n  - For Ruby 2.0 ~ 2.2, please use multi_range \u003c v2.2.0\n\n## Installation\n\n```ruby\ngem 'multi_range'\n```\n\nAnd then execute:\n\n    $ bundle\n\nOr install it yourself as:\n\n    $ gem install multi_range\n\n## Usage\n\nAllow you to manipulate a group of ranges. Such as merging overlapping ranges, doing ranges union, intersection, difference, and so on.\n\n### Sample a number\n```rb\nmulti_range = MultiRange.new([1..5, 10..12])\nmulti_range.sample\n# =\u003e equals to [1, 2, 3, 4, 5, 10, 11, 12].sample\n```\n\n### Difference of ranges\n```rb\nmulti_range = MultiRange.new([1..10])\nmulti_range -= 5..7\nmulti_range.ranges\n# =\u003e [1...5, 8..10]\n```\n\n```rb\nmulti_range = MultiRange.new([1..10, 50..70, 80..100])\nmulti_range -= 5..85\nmulti_range.ranges\n# =\u003e [1...5, 86..100]\n```\n\n```rb\nmulti_range = MultiRange.new([1..10, 50..70, 80..100])\nmulti_range -= MultiRange.new([5..60, 75..85])\nmulti_range.ranges\n# =\u003e [1...5, 61..70, 86..100] \n```\n\n### Union ranges\n\n```rb\nmulti_range = MultiRange.new([1..5])\nmulti_range |= 3..8\nmulti_range.ranges\n# =\u003e [1..8]\n```\n\n```rb\nmulti_range = MultiRange.new([1..5, 10..15, 20..25])\nmulti_range |= MultiRange.new([3..6, 14..22, 30])\nmulti_range.ranges\n# =\u003e [1..6, 10..25, 30..30]\n```\n\n### Intersection ranges\n\n```rb\nmulti_range = MultiRange.new([1..5])\nmulti_range \u0026= 3..8\nmulti_range.ranges\n# =\u003e [3..5]\n```\n\n```rb\nmulti_range = MultiRange.new([1..3, 5..10])\nmulti_range \u0026= MultiRange.new([2..6, 8..9])\nmulti_range.ranges\n# =\u003e [2..3, 5..6, 8..9]\n```\n\n### Merge overlaps\n```rb\nmulti_range = MultiRange.new([1, 2, 4..6, 7, 8..12])\nmulti_range.merge_overlaps.ranges\n# =\u003e [1..2, 4..12]\n\nmulti_range = MultiRange.new([1.2..1.5, 1.7..1.9, 1.8..2.2])\nmulti_range.merge_overlaps.ranges\n# =\u003e [1.2..1.5, 1.7..2.2]\n```\n\n### Check if it overlaps with the other\n\n```rb\nmulti_range = MultiRange.new([1..5, 10..15, 20..25])\nmulti_range.overlaps?(7..8)\n# =\u003e false\n\nmulti_range.overlaps?(3..8)\n# =\u003e true\n\nmulti_range.overlaps?(7..12)\n# =\u003e true\n```\n\n```rb\nmulti_range = MultiRange.new([1..5, 10..15, 20..25])\nmulti_range.overlaps?(MultiRange.new([6..8, 18..22]))\n# =\u003e true\n```\n\n\n### Check if it contains overlaps\n\n```rb\nMultiRange.new([0..3, 5..10, 20..50]).contain_overlaps?\n# =\u003e false\n\nMultiRange.new([0...5, 5..10, 20..50]).contain_overlaps?\n# =\u003e false\n\nMultiRange.new([0..5, 5..10, 20..50]).contain_overlaps?\n# =\u003e true\n\nMultiRange.new([0...7, 5..10, 20..50]).contain_overlaps?\n# =\u003e true\n```\n\n### Range-like interface\n\n#### each\n```rb\nMultiRange.new([1..3, 6, 8..9]).each{|s| print s }\n# =\u003e 123689\n```\n\n#### map\n```rb\nMultiRange.new([1..3, 6, 8..9]).map{|s| s * 2 }\n# =\u003e [2, 4, 6, 12, 16, 18]\n```\n\n#### index_with\n```rb\nMultiRange.new([1..3, 6, 8..9]).index_with(true)\n# =\u003e { 1 =\u003e true, 2 =\u003e true, 3 =\u003e true, 6 =\u003e true, 8 =\u003e true, 9 =\u003e true }\n```\n\n#### min\n```rb\nMultiRange.new([1..3, 6, 8..9]).min\n# =\u003e 1\n```\n\n#### max\n```rb\nMultiRange.new([1..3, 6, 8..9]).max\n# =\u003e 9\n```\n\n#### to_a\n```rb\nMultiRange.new([1..3, 6, 8..9]).to_a\n# =\u003e [1, 2, 3, 6, 8, 9]\n```\n\n\n#### size\n```rb\nMultiRange.new([1..3, 6, 8..9]).size\n# =\u003e 6\n```\n\n### Warning\n\nThe return value may be different when there are some overlapped ranges.\nCall `merge_overlaps` if you want to merge overlapped ranges.\n\n```rb\nMultiRange.new([1..5, 3..6]).to_a\n# =\u003e [1, 2, 3, 4, 5, 3, 4, 5, 6] \n\nMultiRange.new([1..5, 3..6]).merge_overlaps.to_a\n# =\u003e [1, 2, 3, 4, 5, 6]\n```\n\n```rb\nMultiRange.new([1..5, 3..6]).each{|s| print s }\n# =\u003e 123453456\n\nMultiRange.new([1..5, 3..6]).merge_overlaps.each{|s| print s }\n# =\u003e 123456\n```\n\n```rb\nMultiRange.new([1..5, 3..6]).map{|s| s * 2 }\n# =\u003e [2, 4, 6, 8, 10, 6, 8, 10, 12] \n\nMultiRange.new([1..5, 3..6]).merge_overlaps.map{|s| s * 2 }\n# =\u003e [2, 4, 6, 8, 10, 12] \n```\n\n```rb\nMultiRange.new([1..5, 3..6]).size\n# =\u003e 9\n\nMultiRange.new([1..5, 3..6]).merge_overlaps.size\n# =\u003e 6\n```\n\n## Development\n\nAfter 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.\n\nTo install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at https://github.com/khiav223577/multi_range. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.\n\n\n## License\n\nThe gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkhiav223577%2Fmulti_range","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkhiav223577%2Fmulti_range","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkhiav223577%2Fmulti_range/lists"}