Skip to content

Commit

Permalink
feat(pluck): Support multiple parameters.
Browse files Browse the repository at this point in the history
  • Loading branch information
cartant committed Jan 20, 2018
1 parent 090e4aa commit 04d1766
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 3 deletions.
13 changes: 13 additions & 0 deletions source/let/pluck-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,17 @@ describe("let/pluck", () => {
m.expect(destination).toBeObservable(expected);
m.expect(source).toHaveSubscriptions(subs);
}));

it("should pluck the specified nested key", marbles((m) => {

interface Letters { a: { b: { c: { d: { e: { f: string } } } } }; }

const source = m.cold<Letters>("-t-|", { t: { a: { b: { c: { d: { e: { f: "F" } } } } } } });
const subs = "^--!";
const expected = m.cold<string>("-f-|", { f: "F" });

const destination = source.pipe(pluck("a", "b", "c", "d", "e", "f"));
m.expect(destination).toBeObservable(expected);
m.expect(source).toHaveSubscriptions(subs);
}));
});
30 changes: 27 additions & 3 deletions source/let/pluck.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,33 @@
*/

import { Observable } from "rxjs/Observable";
import { map } from "rxjs/operators/map";
import { pluck as untypedPluck } from "rxjs/operators/pluck";

export function pluck<T, K extends keyof T>(key: K): (source: Observable<T>) => Observable<T[K]> {
export function pluck<T, K1 extends keyof T>(
k1: K1
): (source: Observable<T>) => Observable<T[K1]>;

return (source) => source.pipe(map((value: T) => value[key]));
export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1]>(
k1: K1, k2: K2
): (source: Observable<T>) => Observable<T[K1][K2]>;

export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2]>(
k1: K1, k2: K2, k3: K3
): (source: Observable<T>) => Observable<T[K1][K2][K3]>;

export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3]>(
k1: K1, k2: K2, k3: K3, k4: K4
): (source: Observable<T>) => Observable<T[K1][K2][K3][K4]>;

export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4]>(
k1: K1, k2: K2, k3: K3, k4: K4, k5: K5
): (source: Observable<T>) => Observable<T[K1][K2][K3][K4][K5]>;

export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5]>(
k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6
): (source: Observable<T>) => Observable<T[K1][K2][K3][K4][K5][K6]>;

export function pluck<T>(...keys: string[]): (source: Observable<T>) => Observable<any> {

return (source) => untypedPluck(...keys)(source);
}

0 comments on commit 04d1766

Please sign in to comment.