@@ -46,12 +46,15 @@ const resolvedPromise$ = from(resolvedPromise);
46
46
* @param obj - An object of key & Observable values pairs
47
47
* @param durationSelector - An Observable determining the duration for the internal coalescing method
48
48
*/
49
- export function smosh < T extends ObservableMap | ( Partial < T > & NotEmpty < T > ) , U extends Record < string , any > > (
49
+ export function smosh <
50
+ T extends ObservableMap | ( Partial < T > & NotEmpty < T > ) ,
51
+ U extends Record < string , any >
52
+ > (
50
53
obj : Partial < T > ,
51
54
spreads : Observable < U > [ ] = [ ] ,
52
- options ?: { durationSelector : Observable < any > }
53
- ) : Observable < { [ K in keyof T ] : ExtractObservableValue < T [ K ] > } & U > {
54
- let { durationSelector} = options || { } ;
55
+ options ?: { durationSelector : Observable < any > }
56
+ ) : Observable < { [ K in keyof T ] : ExtractObservableValue < T [ K ] > } & U > {
57
+ let { durationSelector } = options || { } ;
55
58
durationSelector = durationSelector || resolvedPromise$ ;
56
59
const keys = Object . keys ( obj ) as ( keyof T ) [ ] ;
57
60
const observables = keys . map ( ( key ) =>
@@ -73,25 +76,32 @@ export function smosh<T extends ObservableMap | (Partial<T> & NotEmpty<T>), U ex
73
76
}
74
77
return obj ;
75
78
} )
76
- )
77
- spreads = spreads . map ( o => o . pipe (
78
- // we avoid using the nullish operator later ;)
79
- filter ( ( v ) => v !== undefined ) ,
80
- // state "changes" differ from each other, this operator ensures distinct values
81
- distinctUntilChanged ( )
79
+ ) ;
80
+ spreads = spreads . map ( ( o ) =>
81
+ o . pipe (
82
+ // we avoid using the nullish operator later ;)
83
+ filter ( ( v ) => v !== undefined ) ,
84
+ // state "changes" differ from each other, this operator ensures distinct values
85
+ distinctUntilChanged ( )
82
86
)
83
87
) ;
84
88
85
- return merge ( ...spreads , obj$ ) . pipe ( scan ( ( acc , slice ) => {
86
- const ks = Object . keys ( slice ) as ( keyof T ) [ ] ;
87
- for ( let i = 0 ; i < ks . length ; i ++ ) {
88
- acc [ ks [ i ] as any ] = slice [ ks [ i ] ] ;
89
- }
90
- return acc as any ;
91
- } , { } ) ) . pipe (
92
- // As combineLatest will emit multiple times for a change in multiple properties we coalesce those emissions together
93
- coalesceWith ( durationSelector ) ,
94
- // by using shareReplay we share the last composition work done to create the accumulated object
95
- shareReplay ( 1 )
96
- ) ;
89
+ return combineLatest ( [ ...spreads , obj$ ] )
90
+ . pipe (
91
+ scan ( ( acc , slices ) => {
92
+ const ks = slices . flatMap ( ( slice ) => Object . keys ( slice ) ) as ( keyof T ) [ ] ;
93
+ slices . forEach ( ( slice ) => {
94
+ for ( let i = 0 ; i < ks . length ; i ++ ) {
95
+ acc [ ks [ i ] as any ] = slice [ ks [ i ] ] ;
96
+ }
97
+ } ) ;
98
+ return acc as any ;
99
+ } , { } )
100
+ )
101
+ . pipe (
102
+ // As combineLatest will emit multiple times for a change in multiple properties we coalesce those emissions together
103
+ coalesceWith ( durationSelector ) ,
104
+ // by using shareReplay we share the last composition work done to create the accumulated object
105
+ shareReplay ( 1 )
106
+ ) ;
97
107
}
0 commit comments