I made some modifications to the code supplied by
Pete Kernan [ruby-talk 13597]. Hope this is of
interest.
# Re: [ruby-talk 13589, 13593, 13594, 13597]
# Determines if an array's elements are in sequential
# order or the order specified by an optional block.
class Array
def seq?
return true if length <= 1
if block_given?
(0..length-2).to_a.each do |i|
return false unless yield (self[i]) == self[i + 1]
end
true
else
(0..length-2).to_a.each do |i|
return false unless self[i].next == self[i + 1]
end
true
end
end
end
if __FILE__ == $0
puts
puts "Checking Array#seq? ..."
a = [1, 2, 3, 4, 5]
p a.seq? # True
p a.seq? {|x| x + 1} # True
p a.seq? {|x| x + 2} # False
b = [1, 3, 9, 27]
p b.seq? # False
p b.seq? {|x| x + 3} # False
p b.seq? {|x| x * 3} # True
c = [1, 0]
p c.seq? # False
p c.seq? {|x| x - 1} # True
p c.seq? {|x| Math.log x} # True
d = %w(a b c d e f)
p d.seq? # True
p d.seq? {|x| x.next} # True
p d.reverse.seq? # False
puts
end