, mixin, , Enumerable, , . , , , , fold - , foreach, , .
, g, . , , , , , Enumerable PITA Ruby. (, , Ruby . Ruby, Enumerable Java # , , , Ruby, .)
Enumerable , , , fold ( reduce/inject, Ruby) , .
module Enumerable
def all?
reduce(true) {|res, el| res && yield(el) }
end
def any?
reduce(false) {|res, el| res || yield(el) }
end
def collect
reduce([]) {|res, el| res + yield(el) }
end
alias_method :map, :collect
def count
reduce(0) {|res, el| res + 1 if yield el }
end
def detect
reduce(nil) {|res, el| if yield el then el end unless res }
end
alias_method :find, :detect
def drop(n=1)
reduce([]) {|res, el| res.tap {|res| res + el unless n -= 1 >= 0 }}
end
def each
reduce(nil) {|_, el| yield el }
end
def each_with_index
reduce(-1) {|i, el| (i+1).tap {|i| yield el, i }}
end
def find_all
reduce([]) {|res, el| res.tap {|res| res + el if yield el }}
end
alias_method :select, :find_all
def grep(pattern)
reduce([]) {|res, el| res.tap {|res| res + yield(el) if pattern === el }}
end
def group_by
reduce(Hash.new {|hsh, key| hsh[key] = [] }) {|res, el| res.tap {|res|
res[yield el] << el
}}
end
def include?(obj)
reduce(false) {|res, el| break true if res || el == obj }
end
def reject
reduce([]) {|res, el| res.tap {|res| res + el unless yield el }}
end
end
, . , . , , reduce, mixin , .
Prelude Ruby, Haskell Prelude ( Haskell Ruby ) Ruby.