1- import { type AnyTuple , type Adaptor , type IsEqual } from "@scripts/common" ;
1+ import { type AnyTuple , type Adaptor , type IsEqual , type Or } from "@scripts/common" ;
22import { type EligiblePrimitiveMatch } from "../pattern" ;
33import { type FlatObject } from "@scripts/object/types/flatObject" ;
4- import { type GetPropsWithValue } from "@scripts/object" ;
4+
5+ type tt = GetIncompleteUnion <
6+ [ "one" , 5 , 7n ] | [ "two" , 5n ] | [ "three" , ...string [ ] ] ,
7+ [ "one" , 5 , 7n ] | [ "two" , 5n ]
8+ > ;
59
610export type GetIncompleteUnion <
711 GenericInput extends unknown ,
@@ -34,17 +38,13 @@ export type GetIncompleteUnion<
3438 InferredInput ,
3539 Exclude < Extract < GenericInput , object > , readonly any [ ] >
3640 > extends true
37- ? {
41+ ? FlatObject < {
3842 [ Prop in ( InferredPatternValue extends any ? keyof InferredPatternValue : never ) ] :
3943 GetIncompleteUnion <
4044 InferredInput [ Adaptor < Prop , keyof InferredInput > ] ,
4145 InferredPatternValue [ Prop ]
4246 >
43- } extends infer InferredResult extends object
44- ? FlatObject <
45- Omit < InferredResult , GetPropsWithValue < InferredResult , never > >
46- >
47- : never
47+ } >
4848 : IsEqual < InferredInput , never > extends true
4949 ? { }
5050 : {
@@ -54,47 +54,80 @@ export type GetIncompleteUnion<
5454 )
5555 | (
5656 [
57- Extract < GenericInput , AnyTuple > ,
57+ Exclude < Extract < GenericInput , AnyTuple > , GenericPatternValue > ,
5858 Extract < GenericPatternValue , AnyTuple > ,
5959 ] extends [
6060 infer InferredInput ,
6161 infer InferredPatternValue ,
6262 ]
6363 ? IsEqual < InferredPatternValue , never > extends true
6464 ? never
65- : [
65+ : IsEqual <
6666 InferredInput ,
67- InferredPatternValue ,
68- ] extends [
69- readonly [ infer InferredInputFirst , ...infer InferredInputRest ] ,
70- readonly [ infer InferredPatternValueFirst , ...infer InferredPatternValueRest ] ,
71- ]
72- ? GetIncompleteUnion <
73- InferredInputFirst ,
74- InferredPatternValueFirst
75- > extends infer InferredResultFirst
76- ? FlatObject < {
77- "[first" : InferredResultFirst ;
78- "rest]" : GetIncompleteUnion <
79- InferredInputRest ,
80- InferredPatternValueRest
81- > ;
82- } >
67+ Extract < GenericInput , AnyTuple >
68+ > extends true
69+ ? [
70+ InferredInput ,
71+ InferredPatternValue ,
72+ ] extends [
73+ readonly [ infer InferredInputFirst , ...infer InferredInputRest ] ,
74+ readonly [ infer InferredPatternValueFirst , ...infer InferredPatternValueRest ] ,
75+ ]
76+ ? GetIncompleteUnion <
77+ InferredInputFirst ,
78+ InferredPatternValueFirst
79+ > extends infer InferredResultFirst
80+ ? FlatObject < {
81+ "[tuple.first" : InferredResultFirst ;
82+ "tuple.rest]" : GetIncompleteUnion <
83+ InferredInputRest ,
84+ InferredPatternValueRest
85+ > ;
86+ } >
87+ : never
8388 : never
84- : never
89+ : IsEqual < InferredInput , never > extends true
90+ ? { }
91+ : {
92+ "[tuple]" : true ;
93+ }
8594 : never
8695 )
8796 | (
8897 [
8998 Exclude < Extract < GenericInput , readonly any [ ] > , AnyTuple > ,
9099 Extract < GenericPatternValue , AnyTuple > ,
91100 ] extends [
92- infer _inferredInput ,
93- infer inferredPatternValue ,
101+ infer InferredInput extends readonly any [ ] ,
102+ infer InferredPatternValue ,
94103 ]
95- ? IsEqual < inferredPatternValue , never > extends true
104+ ? Or < [
105+ IsEqual < InferredPatternValue , never > ,
106+ IsEqual < InferredInput , never > ,
107+ ] > extends true
96108 ? never
97- : never
109+ : InferredPatternValue extends readonly [
110+ infer InferredPatternValueFirst ,
111+ ...infer InferredPatternValueRest ,
112+ ]
113+ ? GetIncompleteUnion <
114+ InferredInput [ number ] ,
115+ InferredPatternValueFirst
116+ > extends infer InferredResultFirst
117+ ? FlatObject < {
118+ "[array.first" : InferredResultFirst ;
119+ "array.rest]" : Or < [
120+ IsEqual < InferredResultFirst , never > ,
121+ IsEqual < InferredResultFirst , { } > ,
122+ ] > extends true
123+ ? GetIncompleteUnion <
124+ InferredInput ,
125+ InferredPatternValueRest
126+ >
127+ : never ;
128+ } >
129+ : never
130+ : never
98131 : never
99132 )
100133) ;
0 commit comments