js-slang
Version:
Javascript-based implementations of Source, written in Typescript
86 lines • 2.86 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.reduce_right = exports.reduce = exports.fold_right = exports.fold = exports.filter = exports.dotted_listQ = void 0;
const scheme_base_1 = require("./scheme-base");
let dotted_listQ = function (list) {
if (list === null) {
return false;
}
else if ((0, scheme_base_1.cdr)(list) === null) {
return false;
}
else if ((0, scheme_base_1.pairQ)((0, scheme_base_1.cdr)(list))) {
return (0, exports.dotted_listQ)((0, scheme_base_1.cdr)(list));
}
else {
return true;
}
};
exports.dotted_listQ = dotted_listQ;
let filter = function (predicate, list) {
if (list === null) {
return null;
}
else if (predicate((0, scheme_base_1.car)(list))) {
return (0, scheme_base_1.cons)((0, scheme_base_1.car)(list), (0, exports.filter)(predicate, (0, scheme_base_1.cdr)(list)));
}
else {
return (0, exports.filter)(predicate, (0, scheme_base_1.cdr)(list));
}
};
exports.filter = filter;
let fold = function (f, init, ...lists) {
if (lists.length === 0) {
return init;
}
if (f.length !== lists.length + 1) {
throw new Error(`Wrong number of arguments to accumulator: expected ${lists.length + 1}, got ${f.length}`);
}
if (lists.some(list => list === null)) {
return init;
}
else {
return (0, exports.fold)(f, f(init, ...lists.map(list => (0, scheme_base_1.car)(list))), ...lists.map(list => (0, scheme_base_1.cdr)(list)));
}
};
exports.fold = fold;
let fold_right = function (f, init, ...lists) {
if (lists.length === 0) {
return init;
}
if (f.length !== lists.length + 1) {
throw new Error(`Wrong number of arguments to accumulator: expected ${lists.length + 1}, got ${f.length}`);
}
if (lists.some(list => list === null)) {
return init;
}
else {
return f(...lists.map(list => (0, scheme_base_1.car)(list)), (0, exports.fold_right)(f, init, ...lists.map(list => (0, scheme_base_1.cdr)(list))));
}
};
exports.fold_right = fold_right;
let reduce = function (f, rIdentity, list) {
if (list === null) {
return rIdentity;
}
if (f.length !== 2) {
throw new Error(`Wrong number of arguments to accumulator: expected 2 got ${f.length}`);
}
else {
return (0, exports.fold)(f, rIdentity, list);
}
};
exports.reduce = reduce;
let reduce_right = function (f, rIdentity, list) {
if (list === null) {
return rIdentity;
}
if (f.length !== 2) {
throw new Error(`Wrong number of arguments to accumulator: expected 2, got ${f.length}`);
}
else {
return (0, exports.fold_right)(f, rIdentity, list);
}
};
exports.reduce_right = reduce_right;
//# sourceMappingURL=scheme-list.js.map
;