range_dsl

RubyのRangeだけではちょっと面倒な部分を簡単に書けるようなDSLを作ってみました。
http://github.com/akm/range_dsl/

作った動機

数値の範囲を示すRangeオブジェクトを幾つか作ったり、どこからか取得できるような仕組みを作っておいて、合致した条件オブジェクトに対して関係するデータだけ処理したい。

ただし条件は単なるRangeや数値として表現できるものもあれば、and/orなどで結合した条件もあったり、Rangeのリテラルでは表現できない正/負の無限大を末端とする場合もある。

このような場合に、Rangeオブジェクトの代わりに以下のように書きたい

gte(100) # greater_than_equal
lt(20) # less_than
eq(3) # equal
neq(4) # not_equal

以下のように結合する場合も必要

gte(3) & lte(7) # 3以上7以下
gte(3).and lte(7) # 同上

lte(3) | gte(7) # 3以下あるいは7以上

インストール方法

$ (sudo) gem install range_dsl

使い方

以下irb

require 'rubygems'
require 'range_dsl'
include RangeDsl

r1 = gte(3) & lt(10)
#=> gte(3) & lt(10)

r2 = r1 | any(11, 13, 15)
#=> gte(3) & lt(10) | any(11, 13, 15)

 r = any(1, 2) | gte(5)
 r.include?(0) # => false
 r.include?(1) # => true
 r.include?(2) # => true
 r.include?(3) # => false
 r.include?(4) # => false
 r.include?(5) # => true

specもちゃんと書いてるので、よかったら見てやってくださいまし。
http://github.com/akm/range_dsl/blob/master/spec/range_dsl_spec.rb