)
-)
+// biome-ignore lint/complexity/noBannedTypes: "{}" is relevant here
+export type Final = (Success | Failure) & ({} | Flags )
+export type Flags = WillFetch | WillRefresh | Refreshing
-export namespace Result {
+export declare namespace Result {
export interface Prototype extends Pipeable.Pipeable, Equal.Equal {
readonly [ResultTypeId]: ResultTypeId
}
@@ -27,6 +25,10 @@ export namespace Result {
export type Progress extends Result.Prototype {
- readonly refreshing: true
+export interface Refreshing {
+ readonly _flag: "Refreshing"
readonly progress: P
}
@@ -113,9 +115,9 @@ export const isInitial = (u: unknown): u is Initial => isResult(u) && u._tag ===
export const isRunning = (u: unknown): u is Running => Object.setPrototypeOf(
- Object.assign({}, result, { refreshing: true, progress }),
+): Omit => Object.setPrototypeOf(
+ Object.assign({}, result, { _flag: "Refreshing", progress }),
Object.getPrototypeOf(result),
)
@@ -203,17 +205,17 @@ export const makeProgressLayer = (): Layer.Layer<
const state = yield* State()
return {
- update: ) => Effect.Do.pipe(
+ update: ) => Effect.Do.pipe(
Effect.bind("previous", () => Effect.andThen(state.get, previous =>
- isRunning(previous) || isRefreshing(previous)
+ (isRunning(previous) || hasRefreshingFlag(previous))
? Effect.succeed(previous)
: Effect.fail(new PreviousResultNotRunningNorRefreshing({ previous })),
)),
Effect.bind("progress", ({ previous }) => f(previous.progress)),
- Effect.let("next", ({ previous, progress }) => Object.setPrototypeOf(
- Object.assign({}, previous, { progress }),
- Object.getPrototypeOf(previous),
- )),
+ Effect.let("next", ({ previous, progress }) => isRunning(previous)
+ ? running(progress)
+ : refreshing(previous, progress) as Final & Refreshing
+ ),
Effect.andThen(({ next }) => state.set(next)),
),
}
@@ -223,19 +225,11 @@ export const makeProgressLayer = (): Layer.Layer<
export namespace unsafeForkEffect {
export type OutputContext = Exclude | Progress