Skip to content

Commit

Permalink
add some type testing
Browse files Browse the repository at this point in the history
  • Loading branch information
brainkim committed Sep 2, 2020
1 parent 787932a commit a5c6628
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 7 deletions.
1 change: 1 addition & 0 deletions packages/pubsub/src/__tests__/pubsub.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,6 @@ describe("InMemoryPubSub", () => {
test("close", () => {
const pubsub = new InMemoryPubSub();
pubsub.close();
expect(1).toEqual(1);
});
});
98 changes: 98 additions & 0 deletions packages/repeater/src/__tests__/combinators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1048,3 +1048,101 @@ describe("combinators", () => {
});
});
});

// Testing type inference.
function _types() {
/* eslint-disable */
let iteration1: Promise<IteratorResult<number>>;
let iteration2: Promise<IteratorResult<string>>;
let iteration3: Promise<IteratorResult<number | string>>;
let iteration4: Promise<IteratorResult<number | string | null>>;

const repeater1 = new Repeater<number, number>((push, stop) => {
push(1);
return -1;
});
const repeater2 = new Repeater<string, string>((push, stop) => {
push("hello");
return "goodbye";
});

const race1 = Repeater.race([Promise.resolve(null), repeater1]);
iteration1 = race1.next();
// @ts-expect-error
iteration2 = race1.next();
iteration3 = race1.next();
iteration4 = race1.next();

const race2 = Repeater.race([Promise.resolve(null), repeater1, repeater2]);

// @ts-expect-error
iteration1 = race2.next();
// @ts-expect-error
iteration2 = race2.next();
iteration3 = race2.next();
iteration4 = race1.next();

const merge1 = Repeater.merge([Promise.resolve("hello"), Promise.resolve(1)]);
// @ts-expect-error
iteration1 = merge1.next();
// @ts-expect-error
iteration2 = merge1.next();
iteration3 = merge1.next();
iteration4 = merge1.next();

const merge2 = Repeater.merge([Promise.resolve(null), repeater1, repeater2]);

// @ts-expect-error
iteration1 = merge2.next();
// @ts-expect-error
iteration2 = merge2.next();
// @ts-expect-error
iteration3 = merge2.next();
iteration4 = merge2.next();

let iteration5: Promise<IteratorResult<[number]>>;
let iteration6: Promise<IteratorResult<[string]>>;
let iteration7: Promise<IteratorResult<[number, string]>>;
let iteration8: Promise<IteratorResult<[null, number, string]>>;

const zip1 = Repeater.zip([repeater1, repeater2]);
// @ts-expect-error
iteration5 = zip1.next();
// @ts-expect-error
iteration6 = zip1.next();
iteration7 = zip1.next();
// @ts-expect-error
iteration8 = zip1.next();

const zip2 = Repeater.zip([Promise.resolve(null), repeater1, repeater2]);
// @ts-expect-error
iteration5 = zip2.next();
// @ts-expect-error
iteration6 = zip2.next();
// @ts-expect-error
iteration7 = zip2.next();
iteration8 = zip2.next();

const latest1 = Repeater.latest([repeater1, repeater2]);
// @ts-expect-error
iteration5 = latest1.next();
// @ts-expect-error
iteration6 = latest1.next();
iteration7 = latest1.next();
// @ts-expect-error
iteration8 = latest1.next();

const latest2 = Repeater.latest([
Promise.resolve(null),
repeater1,
repeater2,
]);
// @ts-expect-error
iteration5 = latest2.next();
// @ts-expect-error
iteration6 = latest2.next();
// @ts-expect-error
iteration7 = latest2.next();
iteration8 = latest2.next();
/* eslint-enable */
}
16 changes: 9 additions & 7 deletions packages/repeater/src/repeater.ts
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ interface NextOperation<T, TReturn, TNext> {
// The value passed to the next method.
value: PromiseLike<TNext> | TNext | undefined;
// The resolve function of the promise returned from next.
resolve(result: Promise<IteratorResult<T, TReturn>>): unknown;
resolve(iteration: Promise<IteratorResult<T, TReturn>>): unknown;
}

/*** REPEATER STATES ***/
Expand Down Expand Up @@ -755,7 +755,7 @@ type Contender<T> =
| T;

function zip(contenders: []): Repeater<never>;
function zip<T>(contenders: Iterable<Contender<T>>): Repeater<T[]>;
function zip<T>(contenders: Iterable<Contender<T>>): Repeater<[T]>;
// prettier-ignore
function zip<T1, T2>(contenders: [Contender<T1>, Contender<T2>]): Repeater<[T1, T2]>;
// prettier-ignore
Expand Down Expand Up @@ -796,9 +796,9 @@ function zip(contenders: Iterable<any>) {
(err) => stop(err),
);

const iterations: Array<IteratorResult<unknown>> | undefined = await new Promise(
(resolve) => (advance = resolve),
);
const iterations:
| Array<IteratorResult<unknown>>
| undefined = await new Promise((resolve) => (advance = resolve));
if (iterations === undefined) {
return;
}
Expand All @@ -818,7 +818,7 @@ function zip(contenders: Iterable<any>) {
}

function latest(contenders: []): Repeater<never>;
function latest<T>(contenders: Iterable<Contender<T>>): Repeater<T[]>;
function latest<T>(contenders: Iterable<Contender<T>>): Repeater<[T]>;
// prettier-ignore
function latest<T1, T2>(contenders: [Contender<T1>, Contender<T2>]): Repeater<[T1, T2]>;
// prettier-ignore
Expand Down Expand Up @@ -850,7 +850,9 @@ function latest(contenders: Iterable<any>) {
}

let advance!: (iterations?: Array<IteratorResult<unknown>>) => unknown;
const advances: Array<(iteration?: IteratorResult<unknown>) => unknown> = [];
const advances: Array<(
iteration?: IteratorResult<unknown>,
) => unknown> = [];
let stopped = false;
stop.then(() => {
advance();
Expand Down

0 comments on commit a5c6628

Please sign in to comment.