Skip to content
This repository has been archived by the owner on Jul 16, 2024. It is now read-only.

Commit

Permalink
Product: fix tuple and struct covariant params (account for empty dat… (
Browse files Browse the repository at this point in the history
  • Loading branch information
gcanti authored Jul 29, 2023
1 parent d4ecf44 commit bfb24ad
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 8 deletions.
5 changes: 5 additions & 0 deletions .changeset/weak-scissors-breathe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@effect/typeclass": patch
---

Product: fix tuple and struct covariant params (account for empty data structures)
8 changes: 4 additions & 4 deletions docs/modules/Product.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ export declare const struct: <F extends TypeLambda>(
) => Kind<
F,
[R[keyof R]] extends [Kind<F, infer R, any, any, any>] ? R : never,
[R[keyof R]] extends [Kind<F, any, infer O, any, any>] ? O : never,
[R[keyof R]] extends [Kind<F, any, any, infer E, any>] ? E : never,
R[keyof R] extends never ? never : [R[keyof R]] extends [Kind<F, any, infer O, any, any>] ? O : never,
R[keyof R] extends never ? never : [R[keyof R]] extends [Kind<F, any, any, infer E, any>] ? E : never,
{ [K in keyof R]: [R[K]] extends [Kind<F, any, any, any, infer A>] ? A : never }
>
```
Expand All @@ -68,8 +68,8 @@ export declare const tuple: <F extends TypeLambda>(
) => Kind<
F,
[T[number]] extends [Kind<F, infer R, any, any, any>] ? R : never,
[T[number]] extends [Kind<F, any, infer O, any, any>] ? O : never,
[T[number]] extends [Kind<F, any, any, infer E, any>] ? E : never,
T[number] extends never ? never : [T[number]] extends [Kind<F, any, infer O, any, any>] ? O : never,
T[number] extends never ? never : [T[number]] extends [Kind<F, any, any, infer E, any>] ? E : never,
{ [I in keyof T]: [T[I]] extends [Kind<F, any, any, any, infer A>] ? A : never }
>
```
Expand Down
3 changes: 3 additions & 0 deletions dtslint/Product.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,8 @@ _.tuple(Product)(fa, fb, fc)
// $ExpectType RAW<{ a: string; } & { b: number; } & { c: boolean; }, "a" | "b" | "c", { fa: string; fb: number; fc: boolean; }>
_.struct(Product)({ fa, fb, fc })

// $ExpectType RAW<unknown, never, []>
_.tuple(Product)() // should allow empty tuple

// $ExpectType RAW<unknown, never, {}>
_.struct(Product)({}) // should allow empty structs
16 changes: 12 additions & 4 deletions src/Product.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,12 @@ export const tuple = <F extends TypeLambda>(F: Product<F>) =>
<T extends ReadonlyArray<Kind<F, any, any, any, any>>>(...elements: T): Kind<
F,
([T[number]] extends [Kind<F, infer R, any, any, any>] ? R : never),
([T[number]] extends [Kind<F, any, infer O, any, any>] ? O : never),
([T[number]] extends [Kind<F, any, any, infer E, any>] ? E : never),
(T[number] extends never ? never
: [T[number]] extends [Kind<F, any, infer O, any, any>] ? O
: never),
(T[number] extends never ? never
: [T[number]] extends [Kind<F, any, any, infer E, any>] ? E
: never),
{ [I in keyof T]: [T[I]] extends [Kind<F, any, any, any, infer A>] ? A : never }
> => F.productAll(elements) as any

Expand All @@ -35,8 +39,12 @@ export const struct = <F extends TypeLambda>(F: Product<F>) =>
<R extends { readonly [x: string]: Kind<F, any, any, any, any> }>(fields: R): Kind<
F,
([R[keyof R]] extends [Kind<F, infer R, any, any, any>] ? R : never),
([R[keyof R]] extends [Kind<F, any, infer O, any, any>] ? O : never),
([R[keyof R]] extends [Kind<F, any, any, infer E, any>] ? E : never),
(R[keyof R] extends never ? never
: [R[keyof R]] extends [Kind<F, any, infer O, any, any>] ? O
: never),
(R[keyof R] extends never ? never
: [R[keyof R]] extends [Kind<F, any, any, infer E, any>] ? E
: never),
{ [K in keyof R]: [R[K]] extends [Kind<F, any, any, any, infer A>] ? A : never }
> => {
const keys = Object.keys(fields)
Expand Down

0 comments on commit bfb24ad

Please sign in to comment.