summaryrefslogtreecommitdiff
path: root/u/trace/trace.ts
diff options
context:
space:
mode:
Diffstat (limited to 'u/trace/trace.ts')
-rw-r--r--u/trace/trace.ts34
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;
+ }
+}