summaryrefslogtreecommitdiff
path: root/u/trace/trace.ts
diff options
context:
space:
mode:
authorElizabeth Hunt <lizhunt@amazon.com>2025-05-13 18:58:45 -0700
committerElizabeth Hunt <lizhunt@amazon.com>2025-05-13 18:58:54 -0700
commit1d66a0f58e4ebcdf4f42c9d78f82a1ab49a2cf11 (patch)
tree07073c060b61688e4635fd4658315cc683589d3d /u/trace/trace.ts
parent2543ac8b11af11f034836591046cdb52911f9403 (diff)
downloadci-1d66a0f58e4ebcdf4f42c9d78f82a1ab49a2cf11.tar.gz
ci-1d66a0f58e4ebcdf4f42c9d78f82a1ab49a2cf11.zip
snapshot!
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;
+ }
+}