0.2.2 #31

Merged
Thilawyn merged 184 commits from next into master 2026-01-16 17:05:31 +01:00
3 changed files with 20 additions and 20 deletions
Showing only changes of commit 8c22206ad7 - Show all commits

View File

@@ -16,6 +16,7 @@ extends Pipeable.Pipeable {
readonly latestKey: Subscribable.Subscribable<Option.Option<K>> readonly latestKey: Subscribable.Subscribable<Option.Option<K>>
readonly fiber: Subscribable.Subscribable<Option.Option<Fiber.Fiber<A, E>>> readonly fiber: Subscribable.Subscribable<Option.Option<Fiber.Fiber<A, E>>>
readonly result: Subscribable.Subscribable<Result.Result<A, E, P>> readonly result: Subscribable.Subscribable<Result.Result<A, E, P>>
readonly latestFinalResult: Subscribable.Subscribable<Option.Option<Result.Final<A, E, P>>>
mutate(key: K): Effect.Effect<Result.Final<A, E, P>> mutate(key: K): Effect.Effect<Result.Final<A, E, P>>
mutateSubscribable(key: K): Effect.Effect<Subscribable.Subscribable<Result.Result<A, E, P>>> mutateSubscribable(key: K): Effect.Effect<Subscribable.Subscribable<Result.Result<A, E, P>>>
@@ -37,20 +38,23 @@ extends Pipeable.Class() implements Mutation<K, A, E, R, P> {
readonly latestKey: SubscriptionRef.SubscriptionRef<Option.Option<K>>, readonly latestKey: SubscriptionRef.SubscriptionRef<Option.Option<K>>,
readonly fiber: SubscriptionRef.SubscriptionRef<Option.Option<Fiber.Fiber<A, E>>>, readonly fiber: SubscriptionRef.SubscriptionRef<Option.Option<Fiber.Fiber<A, E>>>,
readonly result: SubscriptionRef.SubscriptionRef<Result.Result<A, E, P>>, readonly result: SubscriptionRef.SubscriptionRef<Result.Result<A, E, P>>,
readonly latestFinalResult: SubscriptionRef.SubscriptionRef<Option.Option<Result.Final<A, E, P>>>,
) { ) {
super() super()
} }
mutate(key: K): Effect.Effect<Result.Final<A, E, P>> { mutate(key: K): Effect.Effect<Result.Final<A, E, P>> {
return SubscriptionRef.set(this.latestKey, Option.some(key)).pipe( return SubscriptionRef.set(this.latestKey, Option.some(key)).pipe(
Effect.andThen(Effect.provide(this.start(key), this.context)), Effect.andThen(this.start(key)),
Effect.andThen(sub => this.watch(sub)), Effect.andThen(sub => this.watch(sub)),
Effect.provide(this.context),
) )
} }
mutateSubscribable(key: K): Effect.Effect<Subscribable.Subscribable<Result.Result<A, E, P>>> { mutateSubscribable(key: K): Effect.Effect<Subscribable.Subscribable<Result.Result<A, E, P>>> {
return Effect.andThen( return SubscriptionRef.set(this.latestKey, Option.some(key)).pipe(
SubscriptionRef.set(this.latestKey, Option.some(key)), Effect.andThen(this.start(key)),
Effect.provide(this.start(key), this.context) Effect.tap(sub => Effect.forkScoped(this.watch(sub))),
Effect.provide(this.context),
) )
} }
@@ -59,12 +63,8 @@ extends Pipeable.Class() implements Mutation<K, A, E, R, P> {
never, never,
Scope.Scope | R Scope.Scope | R
> { > {
return this.result.pipe( return this.latestFinalResult.pipe(
Effect.map(previous => Result.isFinal(previous) Effect.andThen(initial => Result.unsafeForkEffect(
? previous
: undefined
),
Effect.andThen(previous => Result.unsafeForkEffect(
Effect.onExit(this.f(key), () => Effect.andThen( Effect.onExit(this.f(key), () => Effect.andThen(
Effect.all([Effect.fiberId, this.fiber]), Effect.all([Effect.fiberId, this.fiber]),
([currentFiberId, fiber]) => Option.match(fiber, { ([currentFiberId, fiber]) => Option.match(fiber, {
@@ -76,8 +76,8 @@ extends Pipeable.Class() implements Mutation<K, A, E, R, P> {
)), )),
{ {
initial: Option.isSome(initial) ? Result.willFetch(initial.value) : Result.initial(),
initialProgress: this.initialProgress, initialProgress: this.initialProgress,
previous,
} as Result.unsafeForkEffect.Options<A, E, P>, } as Result.unsafeForkEffect.Options<A, E, P>,
)), )),
Effect.tap(([, fiber]) => SubscriptionRef.set(this.fiber, Option.some(fiber))), Effect.tap(([, fiber]) => SubscriptionRef.set(this.fiber, Option.some(fiber))),
@@ -88,14 +88,14 @@ extends Pipeable.Class() implements Mutation<K, A, E, R, P> {
watch( watch(
sub: Subscribable.Subscribable<Result.Result<A, E, P>> sub: Subscribable.Subscribable<Result.Result<A, E, P>>
): Effect.Effect<Result.Final<A, E, P>> { ): Effect.Effect<Result.Final<A, E, P>> {
return Effect.andThen( return sub.get.pipe(
sub.get, Effect.andThen(initial => Stream.runFoldEffect(
initial => Stream.runFoldEffect( sub.changes,
Stream.filter(sub.changes, Predicate.not(Result.isInitial)),
initial, initial,
(_, result) => Effect.as(SubscriptionRef.set(this.result, result), result), (_, result) => Effect.as(SubscriptionRef.set(this.result, result), result),
), ) as Effect.Effect<Result.Final<A, E, P>>),
) as Effect.Effect<Result.Final<A, E, P>> Effect.tap(result => SubscriptionRef.set(this.latestFinalResult, Option.some(result))),
)
} }
} }
@@ -123,5 +123,6 @@ export const make = Effect.fnUntraced(function* <const K extends Mutation.AnyKey
yield* SubscriptionRef.make(Option.none<K>()), yield* SubscriptionRef.make(Option.none<K>()),
yield* SubscriptionRef.make(Option.none<Fiber.Fiber<A, E>>()), yield* SubscriptionRef.make(Option.none<Fiber.Fiber<A, E>>()),
yield* SubscriptionRef.make(Result.initial<A, E, P>()), yield* SubscriptionRef.make(Result.initial<A, E, P>()),
yield* SubscriptionRef.make(Option.none<Result.Final<A, E, P>>()),
) )
}) })

View File

@@ -203,7 +203,7 @@ extends Pipeable.Class() implements Query<K, A, E, R, P> {
): Effect.Effect<Result.Final<A, E, P>> { ): Effect.Effect<Result.Final<A, E, P>> {
return sub.get.pipe( return sub.get.pipe(
Effect.andThen(initial => Stream.runFoldEffect( Effect.andThen(initial => Stream.runFoldEffect(
Stream.filter(sub.changes, Predicate.not(Result.isInitial)), sub.changes,
initial, initial,
(_, result) => Effect.as(SubscriptionRef.set(this.result, result), result), (_, result) => Effect.as(SubscriptionRef.set(this.result, result), result),
) as Effect.Effect<Result.Final<A, E, P>>), ) as Effect.Effect<Result.Final<A, E, P>>),

View File

@@ -28,7 +28,7 @@ const ResultView = Component.makeUntraced("Result")(function*() {
Effect.andThen(response => response.json), Effect.andThen(response => response.json),
Effect.andThen(Schema.decodeUnknown(Post)), Effect.andThen(Schema.decodeUnknown(Post)),
), ),
staleTime: "1 minutes", staleTime: "10 seconds",
}) })
const mutation = yield* Mutation.make({ const mutation = yield* Mutation.make({
@@ -86,7 +86,6 @@ const ResultView = Component.makeUntraced("Result")(function*() {
<Flex direction="row" justify="center" align="center" gap="1"> <Flex direction="row" justify="center" align="center" gap="1">
<Button onClick={() => runPromise(query.refresh)}>Refresh</Button> <Button onClick={() => runPromise(query.refresh)}>Refresh</Button>
<Button onClick={() => runPromise(query.refetch)}>Refetch</Button>
<Button onClick={() => runPromise(query.invalidateCache)}>Invalidate cache</Button> <Button onClick={() => runPromise(query.invalidateCache)}>Invalidate cache</Button>
</Flex> </Flex>