@@ -8,34 +8,35 @@ import {errorObject} from '../util/errorObject';
8
8
import bindCallback from '../util/bindCallback' ;
9
9
import EmptyError from '../util/EmptyError' ;
10
10
11
- export default function first < T > ( predicate ?: ( value : T , index : number , source : Observable < T > ) => boolean ,
11
+ export default function first < T , R > ( predicate ?: ( value : T , index : number , source : Observable < T > ) => boolean ,
12
+ resultSelector ?: ( value : T , index : number ) => R ,
12
13
thisArg ?: any ,
13
- defaultValue ?: any ) : Observable < T > {
14
- return this . lift ( new FirstOperator ( predicate , thisArg , defaultValue , this ) ) ;
14
+ defaultValue ?: any ) : Observable < R > {
15
+ return this . lift ( new FirstOperator ( predicate , thisArg , resultSelector , defaultValue , this ) ) ;
15
16
}
16
17
17
18
class FirstOperator < T , R > implements Operator < T , R > {
18
19
constructor ( private predicate ?: ( value : T , index : number , source : Observable < T > ) => boolean ,
19
20
private thisArg ?: any ,
21
+ private resultSelector ?: ( value : T , index : number ) => R ,
20
22
private defaultValue ?: any ,
21
23
private source ?: Observable < T > ) {
22
24
}
23
25
24
26
call ( observer : Subscriber < R > ) : Subscriber < T > {
25
- return new FirstSubscriber (
26
- observer , this . predicate , this . thisArg , this . defaultValue , this . source
27
- ) ;
27
+ return new FirstSubscriber ( observer , this . predicate , this . thisArg , this . resultSelector , this . defaultValue , this . source ) ;
28
28
}
29
29
}
30
30
31
- class FirstSubscriber < T > extends Subscriber < T > {
31
+ class FirstSubscriber < T , R > extends Subscriber < T > {
32
32
private predicate : Function ;
33
33
private index : number = 0 ;
34
34
private hasCompleted : boolean = false ;
35
35
36
36
constructor ( destination : Observer < T > ,
37
37
predicate ?: ( value : T , index : number , source : Observable < T > ) => boolean ,
38
38
private thisArg ?: any ,
39
+ private resultSelector ?: ( value : T , index : number ) => R ,
39
40
private defaultValue ?: any ,
40
41
private source ?: Observable < T > ) {
41
42
super ( destination ) ;
@@ -44,18 +45,25 @@ class FirstSubscriber<T> extends Subscriber<T> {
44
45
}
45
46
}
46
47
47
- _next ( value : T ) {
48
- const destination = this . destination ;
49
- const predicate = this . predicate ;
48
+ _next ( value : any ) {
49
+ const { destination, predicate , resultSelector } = this ;
50
+ const index = this . index ++ ;
50
51
let passed : any = true ;
51
52
if ( predicate ) {
52
- passed = tryCatch ( predicate ) ( value , this . index ++ , this . source ) ;
53
+ passed = tryCatch ( predicate ) ( value , index , this . source ) ;
53
54
if ( passed === errorObject ) {
54
- destination . error ( passed . e ) ;
55
+ destination . error ( errorObject . e ) ;
55
56
return ;
56
57
}
57
58
}
58
59
if ( passed ) {
60
+ if ( resultSelector ) {
61
+ value = tryCatch ( resultSelector ) ( value , index ) ;
62
+ if ( value === errorObject ) {
63
+ destination . error ( errorObject . e ) ;
64
+ return ;
65
+ }
66
+ }
59
67
destination . next ( value ) ;
60
68
destination . complete ( ) ;
61
69
this . hasCompleted = true ;
0 commit comments