class BaseFunction {
static #allowInstantiation = false;
constructor(...args) {
if (!BaseFunction.#allowInstantiation) {
throw new Error(
"Why are you trying to use 'new'? Classes are so 2015! Use our fancy 'run' method instead!"
);
}
for (const [name, validator] of this.parameters()) {
this[name] = validator(args.shift());
}
}
parameters() {
return [];
}
body() {
return undefined;
}
static run(...args) {
BaseFunction.#allowInstantiation = true;
const instance = new this(...args);
BaseFunction.#allowInstantiation = false;
return instance.body();
}
}
class Add extends BaseFunction {
parameters() {
return [
["a", (x) => Number(x)],
["b", (x) => Number(x)],
];
}
body() {
return this.a + this.b;
}
}
console.log(Add.run(5, 3)); // 8
You must log in or # to comment.
“Why are you trying to use ‘new’? Classes are so 2015! […]”
Uses new to throw error
I’ve seen something similar to this at work. Horrible.
Very DRY.
That’ll be fun in a multi threaded setting!
What theme are you using, i like it!
Looks like Catppuccin Mocha
A true FP programmer would make it
apply
instead ofrun
…Ahem, map…
And, of course, everything is a lazy list even if the functions can’t handle more than one element in each list.