Improved dispatchers with richer results and added predicate and regular expression based dispatchers

This commit is contained in:
2026-04-12 19:12:00 +02:00
parent 225990b22d
commit cf1abadfc9
8 changed files with 173 additions and 28 deletions

View File

@@ -2,11 +2,12 @@ import { Item_Unresolvable } from '@efforting.tech/errors';
export class Abstract_Resolver {
resolve(item) {
const handler = this.resolve_handler(item);
if (!handler) {
const result = this.resolve_handler(item);
if (!result?.handler) {
throw new Item_Unresolvable({ resolver: this, item });
}
return handler({ resolver: this, item });
// TO DOC: Spreading result into the resulting context means there are some reserved keys we need to be mindful of to avoid clobbering them
return result.handler({ resolver: this, item, ...result });
}
}
@@ -19,14 +20,47 @@ export class Chained_Resolver extends Abstract_Resolver {
resolve_handler(item) {
const { chain_links } = this;
for (const link of chain_links) {
const handler = link.resolve_handler(item);
if (handler) {
return handler;
const result = link.resolve_handler(item);
if (result?.handler) {
return result;
}
}
}
}
export class Predicate_Resolver extends Abstract_Resolver {
constructor(rules=[]) {
// NOTE: Rules should be iterable as [predicate, handler] pairs
super();
Object.assign(this, { rules });
}
resolve_handler(item) {
const { rules } = this;
for (const [predicate, handler] of rules) {
const predicate_result = predicate(item);
if (predicate_result !== undefined) {
return { handler, predicate_result };
}
}
}
}
export class RegExp_Resolver extends Predicate_Resolver {
constructor(rules=[]) {
// NOTE: Rules should be iterable as [predicate, handler] pairs
super();
Object.assign(this, { rules: rules.map(([pattern, handler]) => {
const wrapped_handler = handler; //TODO
const predicate = ((str) => str.match(pattern));
return [predicate, wrapped_handler];
})});
}
}
export class Mapping_Resolver extends Abstract_Resolver {
constructor(rules=new Map(), key_function=null) {