import { IEither, IMetric, ITraceable, ITraceWith, LogLevel, ResultMetric, type Callable, type ITraceableMapper, } from '@emprespresso/pengueno'; export class TraceUtil { static promiseify( mapper: ITraceableMapper, ): ITraceableMapper, Promise, Trace> { return (traceablePromise) => traceablePromise.flatMapAsync(async (t) => t.move(await t.get()).map(mapper)).get(); } static traceResultingEither( metric?: ResultMetric, warnOnFailure = false, ): ITraceableMapper, ITraceable, Trace>, Trace> { return (t) => { if (metric) t.trace.trace( t.get().fold( (_err) => (warnOnFailure ? metric.warn : metric.failure), (_ok) => metric.success, ), ); return t.traceScope((_t) => _t.get().fold( (_err) => (warnOnFailure ? LogLevel.WARN : LogLevel.ERROR), (_ok) => LogLevel.INFO, ), ); }; } static withTrace>( trace: _Trace, ): ITraceableMapper, Trace> { return (t) => t.traceScope(() => trace); } static withMetricTrace(metric: IMetric): ITraceableMapper, Trace> { return TraceUtil.withTrace(metric); } static withFunctionTrace(f: F): ITraceableMapper, Trace> { return TraceUtil.withTrace(`fn.${f.name}`); } static withClassTrace(c: C): ITraceableMapper, Trace> { return TraceUtil.withTrace(`class.${c.constructor.name}`); } }