async-signals
Advanced tools
Comparing version 0.1.9 to 0.1.10
@@ -37,2 +37,1 @@ import { Signal } from "signal-polyfill"; | ||
export declare function pipe<T, U, V, W, X, Y>(signal: PipeInput<T>, fn1: (arg: T) => PipeStep<U>, fn2: (arg: U, prevArg: T) => PipeStep<V>, fn3: (arg: V, prevArg0: U, prevArg1: T) => PipeStep<W>, fn4: (arg: W, prevArg0: V, prevArg1: U, prevArg2: T) => PipeStep<X>, fn5: (arg: X, prevArg0: W, prevArg1: V, prevArg2: U, prevArg3: T) => PipeStep<Y>): AsyncSignal<Y>; | ||
export declare function pipe<T, U, V, W, X, Y, Z>(signal: PipeInput<T>, fn1: (arg: T) => PipeStep<U>, fn2: (arg: U, prevArg: T) => PipeStep<V>, fn3: (arg: V, prevArg0: U, prevArg1: T) => PipeStep<W>, fn4: (arg: W, prevArg0: V, prevArg1: U, prevArg2: T) => PipeStep<X>, fn5: (arg: X, prevArg0: W, prevArg1: V, prevArg2: U, prevArg3: T) => PipeStep<Y>, fn6: (arg: Y, prevArg0: X, prevArg1: W, prevArg2: V, prevArg3: U, prevArg4: T) => PipeStep<Z>): AsyncSignal<Z>; |
@@ -45,3 +45,6 @@ import { Signal } from "signal-polyfill"; | ||
const result = stepResult.get(); | ||
if (!!result && result.get) { | ||
// TODO: improve check of whether this result is a signal or not | ||
if (!!result && | ||
result.get && | ||
!result.has) { | ||
const value = result.get(); | ||
@@ -48,0 +51,0 @@ if (!!value && value.status) { |
@@ -74,18 +74,10 @@ import { Signal } from "signal-polyfill"; | ||
[Signal.subtle.watched]: () => { | ||
try { | ||
task() | ||
.then((value) => { | ||
signal.set({ | ||
status: "completed", | ||
value, | ||
}); | ||
}) | ||
.catch((error) => { | ||
signal.set({ | ||
status: "error", | ||
error, | ||
}); | ||
task() | ||
.then((value) => { | ||
signal.set({ | ||
status: "completed", | ||
value, | ||
}); | ||
} | ||
catch (error) { | ||
}) | ||
.catch((error) => { | ||
signal.set({ | ||
@@ -95,3 +87,3 @@ status: "error", | ||
}); | ||
} | ||
}); | ||
}, | ||
@@ -98,0 +90,0 @@ [Signal.subtle.unwatched]: () => { |
{ | ||
"name": "async-signals", | ||
"version": "0.1.9", | ||
"version": "0.1.10", | ||
"description": "Synthatic sugar and utilities to support async tasks on top of signal-polyfill", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
@@ -6,5 +6,3 @@ import { Signal } from "signal-polyfill"; | ||
export type AnySignal<T> = Signal.State<T> | Signal.Computed<T>; | ||
export type PipeInput<T> = AsyncSignal<T> | AnySignal<T>; | ||
export type PipeStep<T> = | ||
@@ -17,8 +15,8 @@ | AsyncSignal<T> | ||
function isPromise(p: unknown): boolean { | ||
function isPromise(p) { | ||
return ( | ||
p != undefined && | ||
typeof p === "object" && | ||
"then" in (p as any) && | ||
typeof (p as any).then === "function" | ||
"then" in p && | ||
typeof p.then === "function" | ||
); | ||
@@ -29,3 +27,3 @@ } | ||
signal: AsyncSignal<T>, | ||
stepFn: (arg: T, ...args: any[]) => PipeStep<U>, | ||
stepFn: (arg: T, ...previousValue: any[]) => PipeStep<U>, | ||
previoussignals: Array<AsyncSignal<any>>, | ||
@@ -36,9 +34,6 @@ ): AsyncSignal<U> { | ||
let value = values[0]; | ||
if (!!value && (value as AsyncResult<any>).status) { | ||
if ((value as AsyncResult<any>).status === "error") | ||
return value as AsyncResult<U>; | ||
else if ((value as AsyncResult<any>).status === "pending") | ||
return value as AsyncResult<U>; | ||
else value = (value as any).value; | ||
if (!!value && value.status) { | ||
if (value.status === "error") return value; | ||
else if (value.status === "pending") return value; | ||
else value = value.value; | ||
} | ||
@@ -53,3 +48,2 @@ try { | ||
); | ||
return v; | ||
@@ -63,4 +57,3 @@ } catch (e) { | ||
}); | ||
let cachedSignal: AsyncSignal<U> | undefined; | ||
let cachedSignal; | ||
const c = new AsyncComputed(() => { | ||
@@ -74,9 +67,13 @@ const v = signal.get(); | ||
const result = stepResult.get(); | ||
if (!!result && (result as AsyncSignal<any>).get) { | ||
const value = (result as AsyncSignal<any>).get(); | ||
// TODO: improve check of whether this result is a signal or not | ||
if ( | ||
!!result && | ||
(result as AnySignal<any>).get && | ||
!(result as Map<any, any>).has | ||
) { | ||
const value = (result as AnySignal<U>).get(); | ||
if (!!value && (value as AsyncResult<U>).status) { | ||
return value; | ||
} else { | ||
return { status: "completed", value } as AsyncResult<U>; | ||
return { status: "completed", value }; | ||
} | ||
@@ -88,6 +85,6 @@ } else if (isPromise(result)) { | ||
return cachedSignal.get(); | ||
} else if (!!result && (result as AsyncResult<any>).status) { | ||
return result as AsyncResult<U>; | ||
} else if (!!result && (result as AsyncResult<U>).status) { | ||
return result; | ||
} else { | ||
return { status: "completed", value: result as U } as AsyncResult<U>; | ||
return { status: "completed", value: result }; | ||
} | ||
@@ -162,6 +159,6 @@ }); | ||
fn1: (arg: T) => PipeStep<U>, | ||
fn2: (arg: U, prevArg: T) => PipeStep<V>, | ||
fn3: (arg: V, prevArg0: U, prevArg1: T) => PipeStep<W>, | ||
fn4: (arg: W, prevArg0: V, prevArg1: U, prevArg2: T) => PipeStep<X>, | ||
fn5: ( | ||
fn2?: (arg: U, prevArg: T) => PipeStep<V>, | ||
fn3?: (arg: V, prevArg0: U, prevArg1: T) => PipeStep<W>, | ||
fn4?: (arg: W, prevArg0: V, prevArg1: U, prevArg2: T) => PipeStep<X>, | ||
fn5?: ( | ||
arg: X, | ||
@@ -173,3 +170,3 @@ prevArg0: W, | ||
) => PipeStep<Y>, | ||
fn6: ( | ||
fn6?: ( | ||
arg: Y, | ||
@@ -182,49 +179,21 @@ prevArg0: X, | ||
) => PipeStep<Z>, | ||
): AsyncSignal<Z>; | ||
export function pipe<T, U, V, W, X, Y, Z>( | ||
signal: AnySignal<T>, | ||
fn1: (arg: T) => PipeInput<U>, | ||
fn2?: (arg: U, prevArg: T) => PipeInput<V>, | ||
fn3?: (arg: V, prevArg0: U, prevArg1: T) => PipeInput<W>, | ||
fn4?: (arg: W, prevArg0: V, prevArg1: U, prevArg2: T) => PipeInput<X>, | ||
fn5?: ( | ||
arg: X, | ||
prevArg0: W, | ||
prevArg1: V, | ||
prevArg2: U, | ||
prevArg3: T, | ||
) => PipeInput<Y>, | ||
fn6?: ( | ||
arg: Y, | ||
prevArg0: X, | ||
prevArg1: W, | ||
prevArg2: V, | ||
prevArg3: U, | ||
prevArg4: T, | ||
) => PipeInput<Z>, | ||
): AsyncSignal<Z> { | ||
let firstSignal: AsyncSignal<T> = signal as any; | ||
const value = firstSignal.get(); | ||
if (!value || !(typeof value === "object" && "status" in (value as any))) { | ||
if (!value || !(typeof value === "object" && "status" in value)) { | ||
firstSignal = new AsyncComputed(() => { | ||
const v = signal.get(); | ||
const v = signal.get() as T; | ||
return { | ||
status: "completed", | ||
value: v as T, | ||
value: v, | ||
}; | ||
}); | ||
} | ||
const s1: AsyncSignal<U> = pipeStep(firstSignal, fn1, []); | ||
const s1 = pipeStep(firstSignal, fn1, []); | ||
if (!fn2) return s1 as any; | ||
const s2 = pipeStep(s1, fn2, [firstSignal]); | ||
if (!fn3) return s2 as any; | ||
const s3 = pipeStep(s2, fn3, [firstSignal, s1]); | ||
if (!fn4) return s3 as any; | ||
const s4 = pipeStep(s3, fn4, [firstSignal, s1, s2]); | ||
if (!fn5) return s4 as any; | ||
@@ -234,4 +203,3 @@ const s5 = pipeStep(s4, fn5, [firstSignal, s1, s2, s3]); | ||
const s6 = pipeStep(s5, fn6, [firstSignal, s1, s2, s3, s4]); | ||
return s6; | ||
return s6 as any; | ||
} |
@@ -80,22 +80,15 @@ import { Signal } from "signal-polyfill"; | ||
[Signal.subtle.watched]: () => { | ||
try { | ||
task() | ||
.then((value) => { | ||
signal.set({ | ||
status: "completed", | ||
value, | ||
}); | ||
}) | ||
.catch((error) => { | ||
signal.set({ | ||
status: "error", | ||
error, | ||
}); | ||
task() | ||
.then((value) => { | ||
signal.set({ | ||
status: "completed", | ||
value, | ||
}); | ||
} catch (error) { | ||
signal.set({ | ||
status: "error", | ||
error, | ||
}) | ||
.catch((error) => { | ||
signal.set({ | ||
status: "error", | ||
error, | ||
}); | ||
}); | ||
} | ||
}, | ||
@@ -102,0 +95,0 @@ [Signal.subtle.unwatched]: () => { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
60026
916