Module: Comparable

Included in:
Tuple
Defined in:
lib/core/facets/comparable/cap.rb,
lib/core/facets/comparable/cmp.rb,
lib/core/facets/comparable/clip.rb,
lib/core/facets/comparable/op_get.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.[](*accessors) ⇒ Object

Automatically generate comparitive definitions based on attribute fields.

include Comparable[:a, :b]

is equivalent to including a module containing:

def <=>(other)
  cmp = self.a <=> other.a; return cmp unless cmp == 0
  cmp = self.b <=> other.b; return cmp unless cmp == 0
  0
end

16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/core/facets/comparable/op_get.rb', line 16

def self.[](*accessors)
  Module.new do
    include Comparable
    define_method(:comparability){ accessors }
    define_method(:<=>) do |other|
      comparability.each do |a|
        cmp = (send(a) <=> other.send(a))
        break cmp unless cmp == 0
      end
    end
  end
end

Instance Method Details

#at_least(lower) ⇒ Object

Returns the lower of self or x.

4.at_least(5)  #=> 5
6.at_least(5)  #=> 6

CREDIT: Florian Gross


10
11
12
# File 'lib/core/facets/comparable/cap.rb', line 10

def at_least(lower)
  (self >= lower) ? self : lower
end

#at_most(upper) ⇒ Object Also known as: cap

Returns the greater of self or x.

4.at_most(5)  #=> 4
6.at_most(5)  #=> 5

CREDIT: Florian Gross


21
22
23
# File 'lib/core/facets/comparable/cap.rb', line 21

def at_most(upper)
  (self <= upper) ? self : upper
end

#clip(lower, upper = nil) ⇒ Object Also known as: bound

Returns self if above the given lower bound, or within the given lower and upper bounds, otherwise returns the the bound of which the value falls outside.

4.clip(3)    #=> 4
4.clip(5)    #=> 5
4.clip(2,7)  #=> 4
9.clip(2,7)  #=> 7
1.clip(2,7)  #=> 2

CREDIT Florian Gross, Trans


16
17
18
19
20
21
# File 'lib/core/facets/comparable/clip.rb', line 16

def clip(lower, upper=nil)
  return lower if self < lower
  return self unless upper
  return upper if self > upper
  return self
end

#cmp(o) ⇒ Object

Alternate name for comparison operator #<=>.

3.cmp(1)   #=>  1
3.cmp(3)   #=>  0
3.cmp(10)  #=> -1

This fundamental compare method is used to keep comparison compatible with #succ.

CREDIT: Peter Vanbroekhoven


14
15
16
# File 'lib/core/facets/comparable/cmp.rb', line 14

def cmp(o)
  self<=>o
end