From 931511b8902dc72ac233c12326ea35d621212988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 14 Jan 2026 10:29:52 +0100 Subject: [PATCH] Refactor Result --- packages/effect-fc/src/Result.ts | 35 +++++++++----------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/packages/effect-fc/src/Result.ts b/packages/effect-fc/src/Result.ts index a8a72ca..c0275c9 100644 --- a/packages/effect-fc/src/Result.ts +++ b/packages/effect-fc/src/Result.ts @@ -1,4 +1,4 @@ -import { Cause, Context, Data, Effect, Equal, Exit, type Fiber, Hash, Layer, Match, Option, Pipeable, Predicate, PubSub, pipe, Ref, type Scope, Stream, Subscribable } from "effect" +import { Cause, Context, Data, Effect, Equal, Exit, type Fiber, Hash, Layer, Match, Pipeable, Predicate, PubSub, pipe, Ref, type Scope, Stream, Subscribable } from "effect" export const ResultTypeId: unique symbol = Symbol.for("@effect-fc/Result/Result") @@ -12,7 +12,7 @@ export type Result = ( ) // biome-ignore lint/complexity/noBannedTypes: "{}" is relevant here -export type Final = (Success | Failure) & ({} | Flags

) +export type Final = (Success | Failure) & ({} | Flags

) export type Flags

= WillFetch | WillRefresh | Refreshing

export declare namespace Result { @@ -43,10 +43,9 @@ export interface Success extends Result.Prototype { readonly value: A } -export interface Failure extends Result.Prototype { +export interface Failure extends Result.Prototype { readonly _tag: "Failure" readonly cause: Cause.Cause - readonly previousSuccess: Option.Option> } export interface WillFetch { @@ -76,7 +75,7 @@ const ResultPrototype = Object.freeze({ Match.tag("Initial", () => true), Match.tag("Running", self => Equal.equals(self.progress, (that as Running).progress)), Match.tag("Success", self => Equal.equals(self.value, (that as Success).value)), - Match.tag("Failure", self => Equal.equals(self.cause, (that as Failure).cause)), + Match.tag("Failure", self => Equal.equals(self.cause, (that as Failure).cause)), Match.exhaustive, ) }, @@ -105,7 +104,7 @@ export const isFinal = (u: unknown): u is Final => is export const isInitial = (u: unknown): u is Initial => isResult(u) && u._tag === "Initial" export const isRunning = (u: unknown): u is Running => isResult(u) && u._tag === "Running" export const isSuccess = (u: unknown): u is Success => isResult(u) && u._tag === "Success" -export const isFailure = (u: unknown): u is Failure => isResult(u) && u._tag === "Failure" +export const isFailure = (u: unknown): u is Failure => isResult(u) && u._tag === "Failure" export const hasFlag = (u: unknown): u is Flags => isResult(u) && Predicate.hasProperty(u, "_flag") export const hasWillFetchFlag = (u: unknown): u is WillFetch => isResult(u) && Predicate.hasProperty(u, "_flag") && u._flag === "WillFetch" export const hasWillRefreshFlag = (u: unknown): u is WillRefresh => isResult(u) && Predicate.hasProperty(u, "_flag") && u._flag === "WillRefresh" @@ -117,15 +116,7 @@ export const initial: { } = (): Initial => Object.setPrototypeOf({ _tag: "Initial" }, ResultPrototype) export const running =

(progress?: P): Running

=> Object.setPrototypeOf({ _tag: "Running", progress }, ResultPrototype) export const succeed = (value: A): Success => Object.setPrototypeOf({ _tag: "Success", value }, ResultPrototype) - -export const fail = ( - cause: Cause.Cause, - previousSuccess?: Success>, -): Failure => Object.setPrototypeOf({ - _tag: "Failure", - cause, - previousSuccess: Option.fromNullable(previousSuccess), -}, ResultPrototype) +export const fail = (cause: Cause.Cause ): Failure => Object.setPrototypeOf({ _tag: "Failure", cause }, ResultPrototype) export const willFetch = >( result: R @@ -150,11 +141,8 @@ export const refreshing = , P = never>( ) export const fromExit = ( - exit: Exit.Exit, - previousSuccess?: Success>, -): Success | Failure => exit._tag === "Success" - ? succeed(exit.value) - : fail(exit.cause, previousSuccess) + exit: Exit.Exit +): Success | Failure => exit._tag === "Success" ? succeed(exit.value) : fail(exit.cause) export const toExit = ( self: Result @@ -219,7 +207,7 @@ export namespace unsafeForkEffect { export interface Options { // biome-ignore lint/complexity/noBannedTypes: "{}" is relevant here - readonly initial?: (Initial | Success | Failure) & ({} | WillFetch | WillRefresh) + readonly initial?: (Initial | Success | Failure) & ({} | WillFetch | WillRefresh) readonly initialProgress?: P } } @@ -242,10 +230,7 @@ export const unsafeForkEffect = ( ).pipe( Effect.andThen(effect), Effect.onExit(exit => Effect.andThen( - state.set(fromExit( - exit, - isSuccess(options?.initial) ? options.initial : undefined), - ), + state.set(fromExit(exit)), Effect.forkScoped(PubSub.shutdown(pubsub)), )), )),