1
- import { GroupedObservable , identity , Observable , Observer } from "rxjs"
1
+ import { GroupedObservable , Observable , Observer } from "rxjs"
2
2
3
3
/**
4
4
* Creates a "keyed" signal. It's sugar for splitting the Observer and the Observable of a keyed signal.
@@ -20,7 +20,20 @@ export function createKeyedSignal<T>(): [
20
20
* 1. The getter function that returns the GroupedObservable<K, T>
21
21
* 2. The emitter function.
22
22
*/
23
- export function createKeyedSignal < T , K , A extends any [ ] > (
23
+ export function createKeyedSignal < K , T > ( ) : [
24
+ ( key : K ) => GroupedObservable < K , T > ,
25
+ ( key : K , value : T ) => void ,
26
+ ]
27
+
28
+ /**
29
+ * Creates a "keyed" signal. It's sugar for splitting the Observer and the Observable of a keyed signal.
30
+ *
31
+ * @param keySelector a function that extracts the key from the emitted value
32
+ * @returns [1, 2]
33
+ * 1. The getter function that returns the GroupedObservable<K, T>
34
+ * 2. The emitter function.
35
+ */
36
+ export function createKeyedSignal < K , T > (
24
37
keySelector : ( signal : T ) => K ,
25
38
) : [ ( key : K ) => GroupedObservable < K , T > , ( signal : T ) => void ]
26
39
@@ -33,14 +46,14 @@ export function createKeyedSignal<T, K, A extends any[]>(
33
46
* 1. The getter function that returns the GroupedObservable<K, T>
34
47
* 2. The emitter function (...args: any[]) => T.
35
48
*/
36
- export function createKeyedSignal < T , K , A extends any [ ] > (
49
+ export function createKeyedSignal < K , T , A extends any [ ] > (
37
50
keySelector : ( signal : T ) => K ,
38
51
mapper : ( ...args : A ) => T ,
39
52
) : [ ( key : K ) => GroupedObservable < K , T > , ( ...args : A ) => void ]
40
53
41
- export function createKeyedSignal < T , K , A extends any [ ] > (
42
- keySelector : ( signal : T ) => K = identity as any ,
43
- mapper : ( ...args : A ) => T = identity as any ,
54
+ export function createKeyedSignal < K , T , A extends any [ ] > (
55
+ keySelector ? : ( signal : T ) => K ,
56
+ mapper ? : ( ...args : A ) => T ,
44
57
) : [ ( key : K ) => GroupedObservable < K , T > , ( ...args : A ) => void ] {
45
58
const observersMap = new Map < K , Set < Observer < T > > > ( )
46
59
@@ -63,8 +76,13 @@ export function createKeyedSignal<T, K, A extends any[]>(
63
76
return res
64
77
} ,
65
78
( ...args : A ) => {
66
- const payload = mapper ( ...args )
67
- observersMap . get ( keySelector ( payload ) ) ?. forEach ( ( o ) => {
79
+ const payload = mapper
80
+ ? mapper ( ...args )
81
+ : args . length === 2
82
+ ? args [ 1 ]
83
+ : args [ 0 ]
84
+ const key = keySelector ? keySelector ( payload ) : args [ 0 ]
85
+ observersMap . get ( key ) ?. forEach ( ( o ) => {
68
86
o . next ( payload )
69
87
} )
70
88
} ,
0 commit comments