js-slang
Version:
Javascript-based implementations of Source, written in Typescript
64 lines • 2.62 kB
JavaScript
"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