Add zipLatestAll
Lint / lint (push) Successful in 29s

This commit is contained in:
Julien Valverdé
2026-07-16 23:25:34 +02:00
parent df2999d628
commit fc2ff685f4
2 changed files with 40 additions and 8 deletions
+24 -8
View File
@@ -99,6 +99,30 @@ export const mapOptionEffect: {
onNone: () => Effect.succeed(Option.none()), onNone: () => Effect.succeed(Option.none()),
}))) })))
/** Converts typed failures from both channels into `Result` values. */
export const result = <A, E, R>(
self: View<A, E, R>,
): View<Result.Result<A, E>, never, R> => make({
get get() { return Effect.result(self.get) },
get changes() { return Stream.result(self.changes) },
})
/**
* Combines the current values and streams of changes from multiple `View` values.
*/
export const zipLatestAll = <const T extends readonly View<any, any, any>[]>(
...elements: T
): View<
[T[number]] extends [never]
? never
: { [K in keyof T]: T[K] extends View<infer A, infer _E, infer _R> ? A : never },
[T[number]] extends [never] ? never : T[number] extends View<infer _A, infer E, infer _R> ? E : never,
[T[number]] extends [never] ? never : T[number] extends View<infer _A, infer _E, infer R> ? R : never
> => make({
get: Effect.all(elements.map(view => view.get)),
changes: Stream.zipLatestAll(...elements.map(view => view.changes)),
}) as any
/** Maps errors from both the current value and the stream of changes. */ /** Maps errors from both the current value and the stream of changes. */
export const mapError: { export const mapError: {
@@ -192,14 +216,6 @@ export const retry: {
get changes() { return Stream.retry(self.changes, policy) }, get changes() { return Stream.retry(self.changes, policy) },
})) }))
/** Converts typed failures from both channels into `Result` values. */
export const result = <A, E, R>(
self: View<A, E, R>,
): View<Result.Result<A, E>, never, R> => make({
get get() { return Effect.result(self.get) },
get changes() { return Stream.result(self.changes) },
})
/** Narrows the focus to a field of an object. */ /** Narrows the focus to a field of an object. */
export const focusObjectOn: { export const focusObjectOn: {
+16
View File
@@ -40,6 +40,22 @@ export const mapOptionEffect: {
onNone: () => Effect.succeed(Option.none()), onNone: () => Effect.succeed(Option.none()),
}))) })))
/**
* Combines the current values and streams of changes from multiple `Subscribable` values.
*/
export const zipLatestAll = <const T extends readonly Subscribable.Subscribable<any, any, any>[]>(
...elements: T
): Subscribable.Subscribable<
[T[number]] extends [never]
? never
: { [K in keyof T]: T[K] extends Subscribable.Subscribable<infer A, infer _E, infer _R> ? A : never },
[T[number]] extends [never] ? never : T[number] extends Subscribable.Subscribable<infer _A, infer E, infer _R> ? E : never,
[T[number]] extends [never] ? never : T[number] extends Subscribable.Subscribable<infer _A, infer _E, infer R> ? R : never
> => Subscribable.make({
get: Effect.all(elements.map(view => view.get)),
changes: Stream.zipLatestAll(...elements.map(view => view.changes)),
}) as any
/** /**
* Maps errors from both the current value and the stream of changes. * Maps errors from both the current value and the stream of changes.