@@ -28,38 +28,32 @@ export function replaceLastItem<Ts extends unknown[], T>(array: Ts, item: T) {
2828
2929export function filterMap < I , O , C > (
3030 array : I [ ] ,
31- context : ( input : I ) => C ,
32- filter : ( input : I , context : C ) => boolean ,
33- map : ( input : I , context : C ) => O ,
31+ context : ContextCreator < I , C > ,
32+ filter : Filterer < I , C > ,
33+ map : Mapper < I , O , C > ,
3434) : O [ ]
3535export function filterMap < I , O > (
3636 array : I [ ] ,
37- filter : ( input : I ) => I ,
38- map : ( input : I ) => O ,
37+ filter : Filterer < I , never > ,
38+ map : Mapper < I , O , never > ,
3939) : O [ ]
4040export function filterMap < I , O , C > (
4141 array : I [ ] ,
42- contextOrFilter : ( ( input : I ) => C ) | ( ( input : I , context : C ) => boolean ) ,
43- filterOrMap :
44- | ( ( input : I , context : C ) => boolean )
45- | ( ( input : I , context : C ) => O ) ,
46- maybeMap ?: ( input : I , context : C ) => O ,
42+ contextOrFilter : ContextCreator < I , C > | Filterer < I , C > ,
43+ filterOrMap : Filterer < I , C > | Mapper < I , O , C > ,
44+ maybeMap ?: Mapper < I , O , C > ,
4745) : O [ ] {
48- type GetContext = ( input : I ) => C
49- type Filter = ( input : I , context : C ) => boolean
50- type Map = ( input : I , context : C ) => O
51-
52- let context : undefined | GetContext
53- let filter : Filter
54- let map : Map
46+ let context : undefined | ContextCreator < I , C >
47+ let filter : Filterer < I , C >
48+ let map : Mapper < I , O , C >
5549
5650 if ( maybeMap ) {
57- context = contextOrFilter as GetContext
58- filter = filterOrMap as Filter
59- map = maybeMap as Map
51+ context = contextOrFilter as ContextCreator < I , C >
52+ filter = filterOrMap as Filterer < I , C >
53+ map = maybeMap as Mapper < I , O , C >
6054 } else {
61- filter = contextOrFilter as Filter
62- map = filterOrMap as Map
55+ filter = contextOrFilter as Filterer < I , C >
56+ map = filterOrMap as Mapper < I , O , C >
6357 }
6458
6559 const output : O [ ] = [ ]
@@ -69,3 +63,13 @@ export function filterMap<I, O, C>(
6963 }
7064 return output
7165}
66+
67+ type Filterer < I , C > = C extends never
68+ ? ( input : I ) => boolean
69+ : ( input : I , context : C ) => boolean
70+
71+ type Mapper < I , O , C > = C extends never
72+ ? ( input : I ) => O
73+ : ( input : I , context : C ) => O
74+
75+ type ContextCreator < I , C > = ( input : I ) => C
0 commit comments