module Enumerable unless method_defined?(:one?) # 1.8.7+ # Enumerable#one? returns +true+ if and only if exactly one # element in the collection satisfies the given predicate. # # If no predicate is provided, Enumerable#one? returns +true+ if # and only if exactly one element has a true value # (i.e. not +nil+ or +false+). # # [].one? # => false # [nil].one? # => false # [5].one? # => true # [5,8,9].one? # => false # (1...10).one? { |n| n == 5 } # => true # (1...10).one? { |n| n < 5 } # => false # # CREDIT: Gavin Sinclair def one? # :yield: e matches = 0 if block_given? self.each do |e| if yield(e) matches += 1 return false if matches > 1 end end return (matches == 1) else one? { |e| e } end end end end