UNPKG

js-slang

Version:

Javascript-based implementations of Source, written in Typescript

64 lines 2.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.StepperArrayExpression = void 0; const __1 = require("../.."); const generator_1 = require("../../generator"); class StepperArrayExpression { constructor(elements, leadingComments, trailingComments, loc, range) { this.type = 'ArrayExpression'; this.elements = elements; this.leadingComments = leadingComments; this.trailingComments = trailingComments; this.loc = loc; this.range = range; } static create(node) { return new StepperArrayExpression(node.elements.map(element => (element ? (0, generator_1.convert)(element) : null)), node.leadingComments, node.trailingComments, node.loc, node.range); } isContractible() { return false; } isOneStepPossible() { return this.elements.some(element => element && element.isOneStepPossible()); } contract() { __1.redex.preRedex = [this]; throw new Error('Array expressions cannot be contracted'); } oneStep() { if (this.isContractible()) { return this.contract(); } for (let i = 0; i < this.elements.length; i++) { const element = this.elements[i]; if (element && element.isOneStepPossible()) { const newElements = [...this.elements]; newElements[i] = element.oneStep(); return new StepperArrayExpression(newElements, this.leadingComments, this.trailingComments, this.loc, this.range); } } throw new Error('No one step possible'); } substitute(id, value) { return new StepperArrayExpression(this.elements.map(element => (element ? element.substitute(id, value) : null)), this.leadingComments, this.trailingComments, this.loc, this.range); } freeNames() { const names = this.elements .filter(element => element !== null) .map(element => element.freeNames()) .flat(); return Array.from(new Set(names)); } allNames() { const names = this.elements .filter(element => element !== null) .map(element => element.allNames()) .flat(); return Array.from(new Set(names)); } rename(before, after) { return new StepperArrayExpression(this.elements.map(element => (element ? element.rename(before, after) : null)), this.leadingComments, this.trailingComments, this.loc, this.range); } } exports.StepperArrayExpression = StepperArrayExpression; //# sourceMappingURL=ArrayExpression.js.map