import {AbstractFactory} from "./AbstractFactory"; import {DependencyRequirement, PropertyDependency, StaticClass} from "../types"; import {Collection} from "../../util"; /** * A factory whose token is produced by calling a function. * * @example * ```typescript * let i = 0 * const fact = new ClosureFactory('someName', () => { * i += 1 * return i * 2 * }) * * fact.produce([], []) // => 2 * fact.produce([], []) // => 4 * ``` */ export class ClosureFactory extends AbstractFactory { constructor( protected readonly name: string | StaticClass, protected readonly token: () => any, ) { super(token) } produce(dependencies: any[], parameters: any[]): any { return this.token() } match(something: any) { return something === this.name } getDependencyKeys(): Collection { return new Collection() } getInjectedProperties(): Collection { return new Collection() } }