import { SafePromise, Exception, SafeResult } from "@rolesvillesoftware/tools/dist"; import { ExamContext } from "../models/ExamContext"; export abstract class Calculator { constructor(protected context: ExamContext) {} abstract calculate(input?: I): Promise; public static initialize, I, O>(calculatorClass: new (context: ExamContext) => C, context: ExamContext): C { return new calculatorClass(context); } protected async runCalculator, Z, X>(calculatorClass: new (context: ExamContext) => C, input: Z): Promise> { const safeResult = await SafePromise.run(() => Calculator.initialize(calculatorClass, this.context).calculate(input)); return safeResult; } protected processResults(result: SafeResult): X { if (result.isError) { throw new Exception(result.error); } return result.value; } }