diff --git a/packages/effect-fc/src/Result.ts b/packages/effect-fc/src/Result.ts index fe7bdf3..a8a72ca 100644 --- a/packages/effect-fc/src/Result.ts +++ b/packages/effect-fc/src/Result.ts @@ -68,41 +68,32 @@ const ResultPrototype = Object.freeze({ [ResultTypeId]: ResultTypeId, [Equal.symbol](this: Result, that: Result): boolean { - if (this._tag !== that._tag) + if (this._tag !== that._tag || (this as Flags)._flag !== (that as Flags)._flag) + return false + if (hasRefreshingFlag(this) && !Equal.equals(this.progress, (that as Refreshing).progress)) return false - return Match.value(this).pipe( 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) && - (isRefreshing(self) ? self.refreshing : false) === (isRefreshing(that) ? that.refreshing : false) && - Equal.equals(isRefreshing(self) ? self.progress : undefined, isRefreshing(that) ? that.progress : undefined) - ), - Match.tag("Failure", self => - Equal.equals(self.cause, (that as Failure).cause) && - (isRefreshing(self) ? self.refreshing : false) === (isRefreshing(that) ? that.refreshing : false) && - Equal.equals(isRefreshing(self) ? self.progress : undefined, isRefreshing(that) ? that.progress : undefined) - ), + 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.exhaustive, ) }, [Hash.symbol](this: Result): number { - const tagHash = Hash.string(this._tag) - - return Match.value(this).pipe( - Match.tag("Initial", () => tagHash), - Match.tag("Running", self => Hash.combine(Hash.hash(self.progress))(tagHash)), - Match.tag("Success", self => pipe(tagHash, - Hash.combine(Hash.hash(self.value)), - Hash.combine(Hash.hash(isRefreshing(self) ? self.progress : undefined)), - )), - Match.tag("Failure", self => pipe(tagHash, - Hash.combine(Hash.hash(self.cause)), - Hash.combine(Hash.hash(isRefreshing(self) ? self.progress : undefined)), - )), - Match.exhaustive, + return pipe(Hash.string(this._tag), + tagHash => Match.value(this).pipe( + Match.tag("Initial", () => tagHash), + Match.tag("Running", self => Hash.combine(Hash.hash(self.progress))(tagHash)), + Match.tag("Success", self => Hash.combine(Hash.hash(self.value))(tagHash)), + Match.tag("Failure", self => Hash.combine(Hash.hash(self.cause))(tagHash)), + Match.exhaustive, + ), + Hash.combine(Hash.hash((this as Flags)._flag)), + hash => hasRefreshingFlag(this) + ? Hash.combine(Hash.hash(this.progress))(hash) + : hash, Hash.cached(this), ) }, @@ -115,6 +106,7 @@ export const isInitial = (u: unknown): u is Initial => isResult(u) && u._tag === 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 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" export const hasRefreshingFlag = (u: unknown): u is Refreshing => isResult(u) && Predicate.hasProperty(u, "_flag") && u._flag === "Refreshing"