module MultiBlock

Constants

VERSION

Public Class Methods

[](*proc_array) click to toggle source

Multiple block transformation method

# File lib/multi_block/implementation.rb, line 3
def self.[](*proc_array)
  # Create hash representation, proc_array will still get used sometimes
  proc_hash = {}
  proc_array.each{ |proc|
    proc_hash[proc.name] = proc if proc.respond_to?(:name)
  }
  
  # Build yielder proc
  Proc.new{ |*proc_names_and_args|
    if proc_names_and_args.empty? # call all procs
      ret = proc_array.map(&:call)
      
      proc_array.size == 1 ? ret.first : ret
    else
      proc_names, *proc_args = *proc_names_and_args
      
      if proc_names.is_a? Hash # keys: proc_names, values: args
        proc_names.map{ |proc_name, proc_args|
          proc = proc_name.is_a?(Integer) ? proc_array[proc_name] : proc_hash[proc_name.to_sym]
          proc or raise LocalJumpError, "wrong block name given (#{proc_name})"
          
          [proc, Array(proc_args)]
        }.map{ |proc, proc_args|
          proc.call(*proc_args)
        }
        
      else
        ret = Array(proc_names).map{ |proc_name|
          proc = proc_name.is_a?(Integer) ? proc_array[proc_name] : proc_hash[proc_name.to_sym]
          proc or raise LocalJumpError, "wrong block name given (#{proc_name})"
          
          [proc, Array(proc_args)]
        }.map{ |proc, proc_args|
          proc.call(*proc_args)
        }

        ret.size == 1 ? ret.first : ret
        
      end
    end
  }
end