summaryrefslogtreecommitdiff
path: root/utils/trace.ts
diff options
context:
space:
mode:
Diffstat (limited to 'utils/trace.ts')
-rw-r--r--utils/trace.ts47
1 files changed, 29 insertions, 18 deletions
diff --git a/utils/trace.ts b/utils/trace.ts
index eb4ac2f..373f37e 100644
--- a/utils/trace.ts
+++ b/utils/trace.ts
@@ -25,12 +25,15 @@ export interface ITraceable<T, L extends ITraceableLogger<L>> {
mapper: ITraceableMapper<T, L, ITraceableTuple<U>>,
) => ITraceable<U, L>;
peek: (peek: ITraceableMapper<T, L, void>) => ITraceable<T, L>;
- flatMap: <U>(mapper: ITraceableMapper<T, L, ITraceable<U, L>>) => ITraceable<U, L>;
- flatMapAsync<U>(mapper: ITraceableMapper<T, L, Promise<ITraceable<U, L>>>): ITraceable<Promise<U>, L>;
+ flatMap: <U>(
+ mapper: ITraceableMapper<T, L, ITraceable<U, L>>,
+ ) => ITraceable<U, L>;
+ flatMapAsync<U>(
+ mapper: ITraceableMapper<T, L, Promise<ITraceable<U, L>>>,
+ ): ITraceable<Promise<U>, L>;
}
-export class TraceableLogger
- implements ITraceableLogger<TraceableLogger> {
+export class TraceableLogger implements ITraceableLogger<TraceableLogger> {
private readonly logger: Logger = console;
constructor(
private readonly traces = [() => `[${new Date().toISOString()}]`],
@@ -62,23 +65,30 @@ export class TraceableLogger
}
}
-export class TraceableImpl<
+class TraceableImpl<
T,
L extends ITraceableLogger<L>,
> implements ITraceable<T, L> {
- private constructor(readonly item: T, readonly logger: L) {}
+ protected constructor(readonly item: T, readonly logger: L) {}
public map<U>(mapper: ITraceableMapper<T, L, U>) {
const result = mapper(this);
return new TraceableImpl(result, this.logger);
}
- public flatMap<U>(mapper: ITraceableMapper<T, L, ITraceable<U, L>>): ITraceable<U, L> {
+ public flatMap<U>(
+ mapper: ITraceableMapper<T, L, ITraceable<U, L>>,
+ ): ITraceable<U, L> {
return mapper(this);
}
- public flatMapAsync<U>(mapper: ITraceableMapper<T, L, Promise<ITraceable<U, L>>>): ITraceable<Promise<U>, L> {
- return new TraceableImpl(mapper(this).then(({ item }) => item), this.logger);
+ public flatMapAsync<U>(
+ mapper: ITraceableMapper<T, L, Promise<ITraceable<U, L>>>,
+ ): ITraceable<Promise<U>, L> {
+ return new TraceableImpl(
+ mapper(this).then(({ item }) => item),
+ this.logger,
+ );
}
public peek(peek: ITraceableMapper<T, L, void>) {
@@ -95,20 +105,21 @@ export class TraceableImpl<
mapper: ITraceableMapper<T, L, U>,
): ITraceableMapper<Promise<T>, L, Promise<U>> {
return (traceablePromise) =>
- traceablePromise.flatMapAsync(async (t) => {
- const item = await t.item;
- return t.map(() => item).map(mapper);
- }).item;
+ traceablePromise.flatMapAsync(async (t) => {
+ const item = await t.item;
+ return t.map(() => item).map(mapper);
+ }).item;
}
+}
- static withClassTrace<C extends Object, T, L extends ITraceableLogger<L>>(c: C): ITraceableMapper<T, L, ITraceableTuple<T>> {
+export class Traceable<T> extends TraceableImpl<T, TraceableLogger> {
+ static withClassTrace<C extends object, T>(
+ c: C,
+ ): ITraceableMapper<T, TraceableLogger, ITraceableTuple<T>> {
return (t) => [t.item, () => c.constructor.name];
}
static from<T>(t: T) {
- return new TraceableImpl(t, new TraceableLogger());
+ return new Traceable(t, new TraceableLogger());
}
}
-
-export interface Traceable<T, L extends ITraceableLogger<L> = TraceableLogger> extends ITraceable<T, L> {
-}