public static object Map(CallSiteStorage <EachSite> /*!*/ each, [NotNull] BlockParam /*!*/ collector, object self) { RubyArray resultArray = new RubyArray(); object result = resultArray; if (collector.Proc.Dispatcher.ParameterCount <= 1 && !collector.Proc.Dispatcher.HasUnsplatParameter && !collector.Proc.Dispatcher.HasProcParameter) { // optimize for a block with a single parameter: Each(each, self, Proc.Create(each.Context, delegate(BlockParam /*!*/ selfBlock, object _, object item) { object blockResult; if (collector.Yield(item, out blockResult)) { result = blockResult; return(selfBlock.PropagateFlow(collector, blockResult)); } resultArray.Add(blockResult); return(null); })); } else { // general case: Each(each, self, Proc.Create(each.Context, 0, delegate(BlockParam /*!*/ selfBlock, object _, object[] __, RubyArray args) { Debug.Assert(__.Length == 0); object blockResult; if (collector.YieldSplat(args, out blockResult)) { result = blockResult; return(selfBlock.PropagateFlow(collector, blockResult)); } resultArray.Add(blockResult); return(null); })); } return(result); }