Skip to content

Commit a3e8599

Browse files
refactor: simplify filtermap typing
1 parent 0fdbfc0 commit a3e8599

1 file changed

Lines changed: 26 additions & 22 deletions

File tree

packages/message-bus/src/array.ts

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,38 +28,32 @@ export function replaceLastItem<Ts extends unknown[], T>(array: Ts, item: T) {
2828

2929
export 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[]
3535
export 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[]
4040
export 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

Comments
 (0)