Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Extend ruby ranges with math functions
Ruby
Branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib
test
.gitignore
Gemfile
README.textile
Rakefile
RubyRanges.gemspec

README.textile

RubyRanges

RubyRanges is my attempt to move names of Rails gems back to sane naming
conventions. Just because you can name a gem something fun, doesn’t mean I can
find it. I could have named it LoneRanges, HomeOnTheRanges, or RangingOut, but I
didn’t. I named it what it is: RubyRanges.

:)

For the serious documentation:

The real reason I created the ranges is to be able to treat ranges similar to
arrays instead of using “to_a” — which causes inefficiencies. I think of
adding Ranges as a consolidating overlay. I think of subtracting arrays as
a shark bite — whatever that means to you.

Quick Examples

Below are some examples of work, take a look at the tests for more:

Ultimately, I wanted to do something like this:

  (4..88) - (33..45) + (115..122) + (85..110) => [4..33, 45..110, 115..122]

But wait, it works with dates too:

  (Time.now..Time.now + 180) + (Time.now + 360..Time.now + 400) - (Time.now + 380..Time.now + 395) =>
    [Sat Aug 07 00:45:09 -0500 2010..Sat Aug 07 00:48:09 -0500 2010, Sat Aug 07 00:51:09 -0500 2010..Sat Aug 07 00:51:49 -0500 2010]

And it works with letters: (which I really don’t have a usage for)

  ("A".."FB") + ("P".."DE") - ("BC".."MA") => "A".."BC"

(Psst. . . it works with anything Ruby creates a range with)

Long Examples

Addition

  (1..9) + (4..7)  => (1..9)
  (4..7) + (1..9)  => (1..9)
  (1..9) + (5..12) => (1..12)
  (1..9) + (-5..5) => (-5..9)

Addition with non-continuous ranges

  (1..4) + (8..9)  => RubyRanges::Array.new(1..4, 8..9)

Subtraction

  (1..9) - (5..7)  => RubyRanges::Ranges.new(1..5, 7..9)

  (1..9) - (6..12)  => 1..6
  (1..9) - (-1..4)  => 4..9
  (1..9) - (-1..10) => nil

  (1..9) - (11..12) => 1..9

Now for RubyRanges::Array

I created the RubyRanges::Array to give some special actions to +, -, and flatten_ranges
for sets of Ranges. Below are some usage examples.

  RubyRanges::Array.new((1..4), (18..20)) + RubyRanges::Array.new((12..15), (6..9)) =>
    RubyRanges::Array.new((1..4), (6..9), (12..15), (18..20))

  RubyRanges::Array.new((1..10), (15..25)) + RubyRanges::Array.new((8..23), (25..28)) => 1..28

  RubyRanges::Array.new(10..15, 20..25) + RubyRanges::Array.new(5..13, 18..22) =>
    RubyRanges::Array.new(5..15, 18..25)

  RubyRanges::Array.new(10..15, 20..25) + RubyRanges::Array.new(13..18, 23..28) =>
    RubyRanges::Array.new(10..18, 20..28)
  end

  RubyRanges::Array.new(10..15, 20..25) + (28..30) =>
    RubyRanges::Array.new(10..15, 20..25, 28..30)

  RubyRanges::Array.new(10..15, 20..25) + (13..22) => 10..25

  RubyRanges::Array.new(10..15, 20..25) + (18..22) => RubyRanges::Array.new(10..15, 18..25)

Have fun, please donate if you fix / change. Licenses are for the lawyers, if you’re
a lawyer, this is GPLv3. If you’re a coder, this is code.

Something went wrong with that request. Please try again.