Esempio n. 1
0
        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);
        }