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.