Report abuse


			
!!Will the original author of this code please stand up?

ho_enumerable.rb


			
require 'delegate'

module HOM
  class HigherOrderMessage
    def HigherOrderMessage.is_vital(method)
      return method =~ /__(.+)__|method_missing/
    end

    for method in instance_methods
      undef_method(method) unless is_vital(method)
    end

    def initialize(handler)
      @handler = handler
    end
  end

  class Do < HigherOrderMessage
    def method_missing(id, *args)
      @handler.each {|e| e.__send__(id,*args)}
      return nil
    end
  end

  class Are < HigherOrderMessage
    def method_missing(id, *args)
      return @handler.apply {|e| e.__send__(id,*args)}
    end
  end

  class AreNot < HigherOrderMessage
    def method_missing(id, *args)
      return @handler.apply {|e| not e.__send__(id,*args)}
    end
  end

  class Have < HigherOrderMessage
    def method_missing(id, *args)
      return ResultMatcher.new(@handler,id,args)
    end
  end

  class ResultMatcher < HigherOrderMessage
    def initialize(handler, method, args)
      super(handler)
      @method = method
      @args = args
    end

    def method_missing(id, *args)
      @handler.apply do |e|
  result = e.__send__(@method,*@args)
  result.__send__(id,*args)
      end
    end
  end

  class Sort < HigherOrderMessage
    def method_missing(id, *args)
      return @handler.sort do |e1, e2|
  v1 = e1.__send__(id,*args)
  v2 = e2.__send__(id,*args)
  v1 <=> v2
      end
    end
  end

  class ReverseSort < HigherOrderMessage
    def method_missing(id, *args)
      return @handler.sort do |e1, e2|
  v1 = e1.__send__(id,*args)
  v2 = e2.__send__(id,*args)
  v2 <=> v1
      end
    end
  end

  class Extract < HigherOrderMessage
    def method_missing(id, *args)
      return @handler.map {|e| e.__send__(id, *args)}
    end
  end

  class Collator
    def initialize(receiver)
      @receiver = receiver
    end

    def are
      return HOM::Are.new(self)
    end

    def are_not
      return HOM::AreNot.new(self)
    end

    def have
      return HOM::Have.new(self)
    end
  end

  class That < Collator
    def apply(&block)
      return @receiver.select(&block)
    end
  end

  class All < Collator
    def apply(&block)
      return @receiver.all?(&block)
    end
  end

  class Any < Collator
    def apply(&block)
      return @receiver.any?(&block)
    end
  end

# under Rails 1.2.1, I get errors trying to render the template error message if I have this defined
#  class Sum < HigherOrderMessage
#    def method_missing(id, *args)
#      total = 0
#      @handler.each {|e| total = total + e.__send__(id, *args) }
#      return total
#    end
#  end
end

module Enumerable
  def do
    return HOM::Do.new(self)
  end

  def that
    return HOM::That.new(self)
  end

  def all
    return HOM::All.new(self)
  end

  def any
    return HOM::Any.new(self)
  end

  def in_order_of
    return HOM::Sort.new(self)
  end

  def in_reverse_order_of
    return HOM::ReverseSort.new(self)
  end

  def as(a_class)
    return collect {|e| a_class.new(e)}
  end

  def extract
    return HOM::Extract.new(self)
  end

# under Rails 1.2.1, I get errors trying to render the template error message if I have this defined  
#  def sum
#    return HOM::Sum.new(self)
#  end
end