diff --git a/.changeset/fast-experts-melt.md b/.changeset/fast-experts-melt.md new file mode 100644 index 0000000000..fc77ccec73 --- /dev/null +++ b/.changeset/fast-experts-melt.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +fix Unify for RcRef & Deferred diff --git a/packages/effect/dtslint/Unify.ts b/packages/effect/dtslint/Unify.ts index d1b2668264..92069fae68 100644 --- a/packages/effect/dtslint/Unify.ts +++ b/packages/effect/dtslint/Unify.ts @@ -76,7 +76,7 @@ export type SubscriptionRefUnify = Unify.Unify< | SubscriptionRef.SubscriptionRef<1> | SubscriptionRef.SubscriptionRef<"a"> > -// $ExpectType RcRef<"a" | 1, "b" | 2> +// $ExpectType RcRef<1, 2> | RcRef<"a", "b"> export type RcRefUnify = Unify.Unify< | RcRef.RcRef<1, 2> | RcRef.RcRef<"a", "b"> @@ -130,29 +130,29 @@ export type ResourceUnify = Unify.Unify< | Resource.Resource > -// $ExpectType 0 | Option | Ref<1> | SynchronizedRef<1> | SubscriptionRef<1> | Deferred<1, 2> | Deferred<"a", "b"> | Fiber<"a" | 1, "b" | 2> | RuntimeFiber<"a" | 1, "b" | 2> | ManagedRuntime<1, 2> | ManagedRuntime<"a", "b"> | Queue<1> | Queue<"a"> | Dequeue<"a" | 1> | ScopedRef<1> | ScopedRef<"a"> | Resource<1, 2> | Ref<"A"> | SynchronizedRef<"A"> | SubscriptionRef<"A"> | FiberRef<12> | FiberRef<"a2"> | Resource<"a", never> | Latch | Either<1 | "A", 0 | "E"> | Effect<1 | "A", 0 | "E", "R" | "R1"> | RcRef<1 | "A", 0 | "E"> +// $ExpectType 0 | Option | Ref<1> | Ref<"a"> | SynchronizedRef<1> | SynchronizedRef<"a"> | SubscriptionRef<1> | SubscriptionRef<"a"> | RcRef<"a", "b"> | Deferred<"a", "b"> | FiberRef<1> | FiberRef<"a"> | ManagedRuntime<"a", "b"> | Queue<1> | Queue<"a"> | Dequeue<"a" | 1> | ScopedRef<1> | ScopedRef<"a"> | Resource<"a", "b"> | RcRef<1, 0> | Deferred<1, 0> | Resource<1, 0> | Latch | ManagedRuntime<1, 0> | Fiber<"a" | 1, 0 | "b"> | RuntimeFiber<"a" | 1, 0 | "b"> | Either<"a" | 1, 0 | "b"> | Effect<"a" | 1, 0 | "b", "R" | "R1"> export type AllUnify = Unify.Unify< | Either.Either<1, 0> - | Either.Either<"A", "E"> + | Either.Either<"a", "b"> | Option.Option | Option.Option - | Effect.Effect<"A", "E", "R"> + | Effect.Effect<"a", "b", "R"> | Effect.Effect<1, 0, "R1"> | Ref.Ref<1> - | Ref.Ref<"A"> + | Ref.Ref<"a"> | SynchronizedRef.SynchronizedRef<1> - | SynchronizedRef.SynchronizedRef<"A"> + | SynchronizedRef.SynchronizedRef<"a"> | SubscriptionRef.SubscriptionRef<1> - | SubscriptionRef.SubscriptionRef<"A"> + | SubscriptionRef.SubscriptionRef<"a"> | RcRef.RcRef<1, 0> - | RcRef.RcRef<"A", "E"> - | Deferred.Deferred<1, 2> + | RcRef.RcRef<"a", "b"> + | Deferred.Deferred<1, 0> | Deferred.Deferred<"a", "b"> - | FiberRef.FiberRef<12> - | FiberRef.FiberRef<"a2"> - | Fiber.Fiber<1, 2> + | FiberRef.FiberRef<1> + | FiberRef.FiberRef<"a"> + | Fiber.Fiber<1, 0> | Fiber.Fiber<"a", "b"> - | Fiber.RuntimeFiber<1, 2> + | Fiber.RuntimeFiber<1, 0> | Fiber.RuntimeFiber<"a", "b"> | Queue.Queue<1> | Queue.Queue<"a"> @@ -160,10 +160,10 @@ export type AllUnify = Unify.Unify< | Queue.Dequeue<"a"> | ScopedRef.ScopedRef<1> | ScopedRef.ScopedRef<"a"> - | Resource.Resource<1, 2> - | Resource.Resource<"a"> + | Resource.Resource<1, 0> + | Resource.Resource<"a", "b"> | Effect.Latch - | ManagedRuntime.ManagedRuntime<1, 2> + | ManagedRuntime.ManagedRuntime<1, 0> | ManagedRuntime.ManagedRuntime<"a", "b"> | 0 > diff --git a/packages/effect/src/Deferred.ts b/packages/effect/src/Deferred.ts index 10a8cc13d9..e4feb97daa 100644 --- a/packages/effect/src/Deferred.ts +++ b/packages/effect/src/Deferred.ts @@ -52,7 +52,7 @@ export interface Deferred extends Effect.Effect extends Effect.EffectUnify { - Deferred?: () => Extract> + Deferred?: () => Extract> } /** diff --git a/packages/effect/src/Queue.ts b/packages/effect/src/Queue.ts index 2951729717..e9478966ff 100644 --- a/packages/effect/src/Queue.ts +++ b/packages/effect/src/Queue.ts @@ -64,7 +64,7 @@ export type BackingQueueTypeId = typeof BackingQueueTypeId * @since 2.0.0 * @category models */ -export interface Queue extends Enqueue, Dequeue, Pipeable { +export interface Queue extends Enqueue, Dequeue { /** @internal */ readonly queue: BackingQueue /** @internal */ @@ -134,7 +134,7 @@ export interface Enqueue extends Queue.EnqueueVariance, BaseQueue, Pipe * @since 2.0.0 * @category models */ -export interface Dequeue extends Effect.Effect, Queue.DequeueVariance, BaseQueue, Pipeable { +export interface Dequeue extends Effect.Effect, Queue.DequeueVariance, BaseQueue { /** * Takes the oldest value in the queue. If the queue is empty, this will return * a computation that resumes when an item has been added to the queue. diff --git a/packages/effect/src/RcRef.ts b/packages/effect/src/RcRef.ts index e014272d9f..7586c2a6d2 100644 --- a/packages/effect/src/RcRef.ts +++ b/packages/effect/src/RcRef.ts @@ -39,8 +39,7 @@ export interface RcRef * @since 3.8.0 */ export interface RcRefUnify extends Effect.EffectUnify { - RcRef?: () => A[Unify.typeSymbol] extends RcRef | infer _ ? RcRef - : never + RcRef?: () => Extract> } /** diff --git a/packages/effect/src/Resource.ts b/packages/effect/src/Resource.ts index 8dc6debd34..1f9713e770 100644 --- a/packages/effect/src/Resource.ts +++ b/packages/effect/src/Resource.ts @@ -4,7 +4,6 @@ import type * as Effect from "./Effect.js" import type * as Exit from "./Exit.js" import * as internal from "./internal/resource.js" -import type { Pipeable } from "./Pipeable.js" import type * as Schedule from "./Schedule.js" import type * as Scope from "./Scope.js" import type * as ScopedRef from "./ScopedRef.js" @@ -30,7 +29,7 @@ export type ResourceTypeId = typeof ResourceTypeId * @since 2.0.0 * @category models */ -export interface Resource extends Effect.Effect, Resource.Variance, Pipeable { +export interface Resource extends Effect.Effect, Resource.Variance { /** @internal */ readonly scopedRef: ScopedRef.ScopedRef> /** @internal */ diff --git a/packages/effect/src/Unify.ts b/packages/effect/src/Unify.ts index dc6cdd26c5..a024a5b19c 100644 --- a/packages/effect/src/Unify.ts +++ b/packages/effect/src/Unify.ts @@ -34,26 +34,21 @@ export declare const ignoreSymbol: unique symbol */ export type ignoreSymbol = typeof ignoreSymbol -type MaybeReturn = F extends () => any ? ReturnType : F +type MaybeReturn = F extends () => infer R ? R : NonNullable -type Values = X extends any - ? { [k in keyof X[0]]-?: k extends X[1] ? never : MaybeReturn }[keyof X[0]] +type Values = X extends [infer A, infer Ignore] + ? Exclude extends infer k ? k extends keyof A ? MaybeReturn : never : never : never -type Ignore = X extends { - [ignoreSymbol]?: any -} ? keyof NonNullable +type Ignore = X extends { [ignoreSymbol]?: infer Obj } ? keyof NonNullable : never type ExtractTypes< - X extends { - [typeSymbol]?: any - [unifySymbol]?: any - } -> = X extends any ? [ - NonNullable, - Ignore - ] + X +> = X extends { + [typeSymbol]?: infer _Type + [unifySymbol]?: infer _Unify +} ? [NonNullable<_Unify>, Ignore] : never type FilterIn = A extends any ? typeSymbol extends keyof A ? A : never : never