-
Notifications
You must be signed in to change notification settings - Fork 3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(findIndex): add higher-order lettable findIndex
- Loading branch information
Showing
3 changed files
with
44 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
import { Observable } from '../Observable'; | ||
import { FindValueOperator } from '../operators/find'; | ||
import { OperatorFunction } from '../interfaces'; | ||
/** | ||
* Emits only the index of the first value emitted by the source Observable that | ||
* meets some condition. | ||
* | ||
* <span class="informal">It's like {@link find}, but emits the index of the | ||
* found value, not the value itself.</span> | ||
* | ||
* <img src="./img/findIndex.png" width="100%"> | ||
* | ||
* `findIndex` searches for the first item in the source Observable that matches | ||
* the specified condition embodied by the `predicate`, and returns the | ||
* (zero-based) index of the first occurrence in the source. Unlike | ||
* {@link first}, the `predicate` is required in `findIndex`, and does not emit | ||
* an error if a valid value is not found. | ||
* | ||
* @example <caption>Emit the index of first click that happens on a DIV element</caption> | ||
* var clicks = Rx.Observable.fromEvent(document, 'click'); | ||
* var result = clicks.findIndex(ev => ev.target.tagName === 'DIV'); | ||
* result.subscribe(x => console.log(x)); | ||
* | ||
* @see {@link filter} | ||
* @see {@link find} | ||
* @see {@link first} | ||
* @see {@link take} | ||
* | ||
* @param {function(value: T, index: number, source: Observable<T>): boolean} predicate | ||
* A function called with each item to test for condition matching. | ||
* @param {any} [thisArg] An optional argument to determine the value of `this` | ||
* in the `predicate` function. | ||
* @return {Observable} An Observable of the index of the first item that | ||
* matches the condition. | ||
* @method find | ||
* @owner Observable | ||
*/ | ||
export function findIndex<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean, | ||
thisArg?: any): OperatorFunction<T, number> { | ||
return (source: Observable<T>) => source.lift(new FindValueOperator(predicate, source, true, thisArg)) as Observable<any>; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters