diff options
Diffstat (limited to 'u/trace/trace.ts')
-rw-r--r-- | u/trace/trace.ts | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/u/trace/trace.ts b/u/trace/trace.ts new file mode 100644 index 0000000..5d5c59b --- /dev/null +++ b/u/trace/trace.ts @@ -0,0 +1,34 @@ +import type { Callable } from "@emprespresso/utils"; +import { + type ITraceableMapper, + type ITraceableTuple, + TraceableImpl, + TraceableLogger, +} from "./mod.ts"; + +export class Traceable<T> extends TraceableImpl<T, TraceableLogger> { + static from<T>(t: T) { + return new Traceable(t, new TraceableLogger()); + } + + static withFunctionTrace<F extends Callable, T>( + f: F, + ): ITraceableMapper<T, TraceableLogger, ITraceableTuple<T>> { + return (t) => [t.item, f.name]; + } + + static withClassTrace<C extends object, T>( + c: C, + ): ITraceableMapper<T, TraceableLogger, ITraceableTuple<T>> { + return (t) => [t.item, c.constructor.name]; + } + + static promiseify<T, U>( + mapper: ITraceableMapper<T, TraceableLogger, U>, + ): ITraceableMapper<Promise<T>, TraceableLogger, Promise<U>> { + return (traceablePromise) => + traceablePromise.flatMapAsync(async (t) => + t.move(await t.item).map(mapper) + ).item; + } +} |