// Generated by generate-thunkify.js
/**
 * Copyright 2018 Shape Security, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License")
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

module.exports = function thunkify(reducer) {
  return {
    reduceArrayAssignmentTarget(node, { elements, rest }) {
      return reducer.reduceArrayAssignmentTarget(node, { elements: elements.map(n => n == null ? null : n()), rest: rest == null ? null : rest() });
    },

    reduceArrayBinding(node, { elements, rest }) {
      return reducer.reduceArrayBinding(node, { elements: elements.map(n => n == null ? null : n()), rest: rest == null ? null : rest() });
    },

    reduceArrayExpression(node, { elements }) {
      return reducer.reduceArrayExpression(node, { elements: elements.map(n => n == null ? null : n()) });
    },

    reduceArrowExpression(node, { params, body }) {
      return reducer.reduceArrowExpression(node, { params: params(), body: body() });
    },

    reduceAssignmentExpression(node, { binding, expression }) {
      return reducer.reduceAssignmentExpression(node, { binding: binding(), expression: expression() });
    },

    reduceAssignmentTargetIdentifier(node) {
      return reducer.reduceAssignmentTargetIdentifier(node);
    },

    reduceAssignmentTargetPropertyIdentifier(node, { binding, init }) {
      return reducer.reduceAssignmentTargetPropertyIdentifier(node, { binding: binding(), init: init == null ? null : init() });
    },

    reduceAssignmentTargetPropertyProperty(node, { name, binding }) {
      return reducer.reduceAssignmentTargetPropertyProperty(node, { name: name(), binding: binding() });
    },

    reduceAssignmentTargetWithDefault(node, { binding, init }) {
      return reducer.reduceAssignmentTargetWithDefault(node, { binding: binding(), init: init() });
    },

    reduceAwaitExpression(node, { expression }) {
      return reducer.reduceAwaitExpression(node, { expression: expression() });
    },

    reduceBinaryExpression(node, { left, right }) {
      return reducer.reduceBinaryExpression(node, { left: left(), right: right() });
    },

    reduceBindingIdentifier(node) {
      return reducer.reduceBindingIdentifier(node);
    },

    reduceBindingPropertyIdentifier(node, { binding, init }) {
      return reducer.reduceBindingPropertyIdentifier(node, { binding: binding(), init: init == null ? null : init() });
    },

    reduceBindingPropertyProperty(node, { name, binding }) {
      return reducer.reduceBindingPropertyProperty(node, { name: name(), binding: binding() });
    },

    reduceBindingWithDefault(node, { binding, init }) {
      return reducer.reduceBindingWithDefault(node, { binding: binding(), init: init() });
    },

    reduceBlock(node, { statements }) {
      return reducer.reduceBlock(node, { statements: statements.map(n => n()) });
    },

    reduceBlockStatement(node, { block }) {
      return reducer.reduceBlockStatement(node, { block: block() });
    },

    reduceBreakStatement(node) {
      return reducer.reduceBreakStatement(node);
    },

    reduceCallExpression(node, { callee, arguments: _arguments }) {
      return reducer.reduceCallExpression(node, { callee: callee(), arguments: _arguments.map(n => n()) });
    },

    reduceCatchClause(node, { binding, body }) {
      return reducer.reduceCatchClause(node, { binding: binding == null ? null : binding(), body: body() });
    },

    reduceClassDeclaration(node, { name, super: _super, elements }) {
      return reducer.reduceClassDeclaration(node, { name: name(), super: _super == null ? null : _super(), elements: elements.map(n => n()) });
    },

    reduceClassElement(node, { method }) {
      return reducer.reduceClassElement(node, { method: method() });
    },

    reduceClassExpression(node, { name, super: _super, elements }) {
      return reducer.reduceClassExpression(node, { name: name == null ? null : name(), super: _super == null ? null : _super(), elements: elements.map(n => n()) });
    },

    reduceCompoundAssignmentExpression(node, { binding, expression }) {
      return reducer.reduceCompoundAssignmentExpression(node, { binding: binding(), expression: expression() });
    },

    reduceComputedMemberAssignmentTarget(node, { object, expression }) {
      return reducer.reduceComputedMemberAssignmentTarget(node, { object: object(), expression: expression() });
    },

    reduceComputedMemberExpression(node, { object, expression }) {
      return reducer.reduceComputedMemberExpression(node, { object: object(), expression: expression() });
    },

    reduceComputedPropertyName(node, { expression }) {
      return reducer.reduceComputedPropertyName(node, { expression: expression() });
    },

    reduceConditionalExpression(node, { test, consequent, alternate }) {
      return reducer.reduceConditionalExpression(node, { test: test(), consequent: consequent(), alternate: alternate() });
    },

    reduceContinueStatement(node) {
      return reducer.reduceContinueStatement(node);
    },

    reduceDataProperty(node, { name, expression }) {
      return reducer.reduceDataProperty(node, { name: name(), expression: expression() });
    },

    reduceDebuggerStatement(node) {
      return reducer.reduceDebuggerStatement(node);
    },

    reduceDirective(node) {
      return reducer.reduceDirective(node);
    },

    reduceDoWhileStatement(node, { body, test }) {
      return reducer.reduceDoWhileStatement(node, { body: body(), test: test() });
    },

    reduceEmptyStatement(node) {
      return reducer.reduceEmptyStatement(node);
    },

    reduceExport(node, { declaration }) {
      return reducer.reduceExport(node, { declaration: declaration() });
    },

    reduceExportAllFrom(node) {
      return reducer.reduceExportAllFrom(node);
    },

    reduceExportDefault(node, { body }) {
      return reducer.reduceExportDefault(node, { body: body() });
    },

    reduceExportFrom(node, { namedExports }) {
      return reducer.reduceExportFrom(node, { namedExports: namedExports.map(n => n()) });
    },

    reduceExportFromSpecifier(node) {
      return reducer.reduceExportFromSpecifier(node);
    },

    reduceExportLocalSpecifier(node, { name }) {
      return reducer.reduceExportLocalSpecifier(node, { name: name() });
    },

    reduceExportLocals(node, { namedExports }) {
      return reducer.reduceExportLocals(node, { namedExports: namedExports.map(n => n()) });
    },

    reduceExpressionStatement(node, { expression }) {
      return reducer.reduceExpressionStatement(node, { expression: expression() });
    },

    reduceForAwaitStatement(node, { left, right, body }) {
      return reducer.reduceForAwaitStatement(node, { left: left(), right: right(), body: body() });
    },

    reduceForInStatement(node, { left, right, body }) {
      return reducer.reduceForInStatement(node, { left: left(), right: right(), body: body() });
    },

    reduceForOfStatement(node, { left, right, body }) {
      return reducer.reduceForOfStatement(node, { left: left(), right: right(), body: body() });
    },

    reduceForStatement(node, { init, test, update, body }) {
      return reducer.reduceForStatement(node, { init: init == null ? null : init(), test: test == null ? null : test(), update: update == null ? null : update(), body: body() });
    },

    reduceFormalParameters(node, { items, rest }) {
      return reducer.reduceFormalParameters(node, { items: items.map(n => n()), rest: rest == null ? null : rest() });
    },

    reduceFunctionBody(node, { directives, statements }) {
      return reducer.reduceFunctionBody(node, { directives: directives.map(n => n()), statements: statements.map(n => n()) });
    },

    reduceFunctionDeclaration(node, { name, params, body }) {
      return reducer.reduceFunctionDeclaration(node, { name: name(), params: params(), body: body() });
    },

    reduceFunctionExpression(node, { name, params, body }) {
      return reducer.reduceFunctionExpression(node, { name: name == null ? null : name(), params: params(), body: body() });
    },

    reduceGetter(node, { name, body }) {
      return reducer.reduceGetter(node, { name: name(), body: body() });
    },

    reduceIdentifierExpression(node) {
      return reducer.reduceIdentifierExpression(node);
    },

    reduceIfStatement(node, { test, consequent, alternate }) {
      return reducer.reduceIfStatement(node, { test: test(), consequent: consequent(), alternate: alternate == null ? null : alternate() });
    },

    reduceImport(node, { defaultBinding, namedImports }) {
      return reducer.reduceImport(node, { defaultBinding: defaultBinding == null ? null : defaultBinding(), namedImports: namedImports.map(n => n()) });
    },

    reduceImportNamespace(node, { defaultBinding, namespaceBinding }) {
      return reducer.reduceImportNamespace(node, { defaultBinding: defaultBinding == null ? null : defaultBinding(), namespaceBinding: namespaceBinding() });
    },

    reduceImportSpecifier(node, { binding }) {
      return reducer.reduceImportSpecifier(node, { binding: binding() });
    },

    reduceLabeledStatement(node, { body }) {
      return reducer.reduceLabeledStatement(node, { body: body() });
    },

    reduceLiteralBooleanExpression(node) {
      return reducer.reduceLiteralBooleanExpression(node);
    },

    reduceLiteralInfinityExpression(node) {
      return reducer.reduceLiteralInfinityExpression(node);
    },

    reduceLiteralNullExpression(node) {
      return reducer.reduceLiteralNullExpression(node);
    },

    reduceLiteralNumericExpression(node) {
      return reducer.reduceLiteralNumericExpression(node);
    },

    reduceLiteralRegExpExpression(node) {
      return reducer.reduceLiteralRegExpExpression(node);
    },

    reduceLiteralStringExpression(node) {
      return reducer.reduceLiteralStringExpression(node);
    },

    reduceMethod(node, { name, params, body }) {
      return reducer.reduceMethod(node, { name: name(), params: params(), body: body() });
    },

    reduceModule(node, { directives, items }) {
      return reducer.reduceModule(node, { directives: directives.map(n => n()), items: items.map(n => n()) });
    },

    reduceNewExpression(node, { callee, arguments: _arguments }) {
      return reducer.reduceNewExpression(node, { callee: callee(), arguments: _arguments.map(n => n()) });
    },

    reduceNewTargetExpression(node) {
      return reducer.reduceNewTargetExpression(node);
    },

    reduceObjectAssignmentTarget(node, { properties, rest }) {
      return reducer.reduceObjectAssignmentTarget(node, { properties: properties.map(n => n()), rest: rest == null ? null : rest() });
    },

    reduceObjectBinding(node, { properties, rest }) {
      return reducer.reduceObjectBinding(node, { properties: properties.map(n => n()), rest: rest == null ? null : rest() });
    },

    reduceObjectExpression(node, { properties }) {
      return reducer.reduceObjectExpression(node, { properties: properties.map(n => n()) });
    },

    reduceReturnStatement(node, { expression }) {
      return reducer.reduceReturnStatement(node, { expression: expression == null ? null : expression() });
    },

    reduceScript(node, { directives, statements }) {
      return reducer.reduceScript(node, { directives: directives.map(n => n()), statements: statements.map(n => n()) });
    },

    reduceSetter(node, { name, param, body }) {
      return reducer.reduceSetter(node, { name: name(), param: param(), body: body() });
    },

    reduceShorthandProperty(node, { name }) {
      return reducer.reduceShorthandProperty(node, { name: name() });
    },

    reduceSpreadElement(node, { expression }) {
      return reducer.reduceSpreadElement(node, { expression: expression() });
    },

    reduceSpreadProperty(node, { expression }) {
      return reducer.reduceSpreadProperty(node, { expression: expression() });
    },

    reduceStaticMemberAssignmentTarget(node, { object }) {
      return reducer.reduceStaticMemberAssignmentTarget(node, { object: object() });
    },

    reduceStaticMemberExpression(node, { object }) {
      return reducer.reduceStaticMemberExpression(node, { object: object() });
    },

    reduceStaticPropertyName(node) {
      return reducer.reduceStaticPropertyName(node);
    },

    reduceSuper(node) {
      return reducer.reduceSuper(node);
    },

    reduceSwitchCase(node, { test, consequent }) {
      return reducer.reduceSwitchCase(node, { test: test(), consequent: consequent.map(n => n()) });
    },

    reduceSwitchDefault(node, { consequent }) {
      return reducer.reduceSwitchDefault(node, { consequent: consequent.map(n => n()) });
    },

    reduceSwitchStatement(node, { discriminant, cases }) {
      return reducer.reduceSwitchStatement(node, { discriminant: discriminant(), cases: cases.map(n => n()) });
    },

    reduceSwitchStatementWithDefault(node, { discriminant, preDefaultCases, defaultCase, postDefaultCases }) {
      return reducer.reduceSwitchStatementWithDefault(node, { discriminant: discriminant(), preDefaultCases: preDefaultCases.map(n => n()), defaultCase: defaultCase(), postDefaultCases: postDefaultCases.map(n => n()) });
    },

    reduceTemplateElement(node) {
      return reducer.reduceTemplateElement(node);
    },

    reduceTemplateExpression(node, { tag, elements }) {
      return reducer.reduceTemplateExpression(node, { tag: tag == null ? null : tag(), elements: elements.map(n => n()) });
    },

    reduceThisExpression(node) {
      return reducer.reduceThisExpression(node);
    },

    reduceThrowStatement(node, { expression }) {
      return reducer.reduceThrowStatement(node, { expression: expression() });
    },

    reduceTryCatchStatement(node, { body, catchClause }) {
      return reducer.reduceTryCatchStatement(node, { body: body(), catchClause: catchClause() });
    },

    reduceTryFinallyStatement(node, { body, catchClause, finalizer }) {
      return reducer.reduceTryFinallyStatement(node, { body: body(), catchClause: catchClause == null ? null : catchClause(), finalizer: finalizer() });
    },

    reduceUnaryExpression(node, { operand }) {
      return reducer.reduceUnaryExpression(node, { operand: operand() });
    },

    reduceUpdateExpression(node, { operand }) {
      return reducer.reduceUpdateExpression(node, { operand: operand() });
    },

    reduceVariableDeclaration(node, { declarators }) {
      return reducer.reduceVariableDeclaration(node, { declarators: declarators.map(n => n()) });
    },

    reduceVariableDeclarationStatement(node, { declaration }) {
      return reducer.reduceVariableDeclarationStatement(node, { declaration: declaration() });
    },

    reduceVariableDeclarator(node, { binding, init }) {
      return reducer.reduceVariableDeclarator(node, { binding: binding(), init: init == null ? null : init() });
    },

    reduceWhileStatement(node, { test, body }) {
      return reducer.reduceWhileStatement(node, { test: test(), body: body() });
    },

    reduceWithStatement(node, { object, body }) {
      return reducer.reduceWithStatement(node, { object: object(), body: body() });
    },

    reduceYieldExpression(node, { expression }) {
      return reducer.reduceYieldExpression(node, { expression: expression == null ? null : expression() });
    },

    reduceYieldGeneratorExpression(node, { expression }) {
      return reducer.reduceYieldGeneratorExpression(node, { expression: expression() });
    },
  };
};
