code: function mapAsyncReturns(ast) {
          if (Array.isArray(ast)) {
              return ast.map(mapAsyncReturns);
          }
          var lambdaNesting = 0;
          return treeWalk(ast, function (node, descend, path) {
              if ((node.type === 'ThrowStatement' || node.type === 'ReturnStatement') && !node.$mapped) {
                  if (lambdaNesting > 0) {
                      if (examine(node).isAsync) {
                          delete node.async;
                          node.argument = {
                              "type": "CallExpression",
                              "callee": node.type === 'ThrowStatement' ? genIdent.error : genIdent.return,
                              "arguments": node.argument ? [node.argument] : []
                          };
                          node.type = 'ReturnStatement';
                          return;
                      }
                  }
              } else if (examine(node).isFunction) {
                  lambdaNesting++;
                  descend(node);
                  lambdaNesting--;
                  return;
              }
              descend(node);
          });
      }
docs: /*
  Rewrite
  async function <name>?<argumentlist><body>
  to
  function <name>?<argumentlist>{ return function*() {<body>}.$asyncspawn(Promise,this); }
  or if the $runtime is set:
  $runtime.$asyncspawn.call(function <name>?<argumentlist>{ return function*() {<body>},Promise,this); }
   Like mapReturns, but ONLY for return/throw async