Skip to content

Commit ba6e210

Browse files
committed
Add branch awareness and tests for the type of 'alt'
1 parent 11b66cb commit ba6e210

File tree

2 files changed

+68
-2
lines changed

2 files changed

+68
-2
lines changed

index.d.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,37 @@ export function and<L, R>(second: Uncertain<L, R>): {
8484
}
8585

8686
/** Logical or for Futures. See https://github.com/fluture-js/Fluture#alt */
87-
export function alt<L, R>(left: FutureInstance<L, R>): (right: FutureInstance<L, R>) => FutureInstance<L, R>
87+
export function alt<L>(second: Rejected<L>): {
88+
(first: Never): Never
89+
(first: Rejected<any>): Rejected<L>
90+
<R>(first: Resolved<R>): Resolved<R>
91+
<R>(first: Uncertain<any, R>): Uncertain<L, R>
92+
}
93+
94+
/** Logical or for Futures. See https://github.com/fluture-js/Fluture#alt */
95+
export function alt<L, R>(second: Uncertain<L, R>): {
96+
<T>(first: Resolved<T>): Resolved<T>
97+
(first: Rejected<any>): Uncertain<L, R>
98+
(first: Uncertain<any, R>): Uncertain<L, R>
99+
}
100+
101+
/** Race two ConcurrentFutures. See https://github.com/fluture-js/Fluture#alt */
102+
export function alt(second: ConcurrentNever): <L, R>(first: ConcurrentUncertain<L, R>) => ConcurrentUncertain<L, R>
103+
104+
/** Race two ConcurrentFutures. See https://github.com/fluture-js/Fluture#alt */
105+
export function alt<L>(second: ConcurrentRejected<L>): {
106+
<R>(first: ConcurrentResolved<R>): ConcurrentUncertain<L, R>
107+
<R>(first: ConcurrentUncertain<L, R>): ConcurrentUncertain<L, R>
108+
}
109+
110+
/** Race two ConcurrentFutures. See https://github.com/fluture-js/Fluture#alt */
111+
export function alt<R>(second: ConcurrentResolved<R>): {
112+
<L>(first: ConcurrentRejected<L>): ConcurrentUncertain<L, R>
113+
<L>(first: ConcurrentUncertain<L, R>): ConcurrentUncertain<L, R>
114+
}
88115

89116
/** Race two ConcurrentFutures. See https://github.com/fluture-js/Fluture#alt */
90-
export function alt<L, R>(left: ConcurrentFutureInstance<L, R>): (right: ConcurrentFutureInstance<L, R>) => ConcurrentFutureInstance<L, R>
117+
export function alt<L, R>(second: ConcurrentUncertain<L, R>): (first: ConcurrentUncertain<L, R>) => ConcurrentUncertain<L, R>
91118

92119
/** Apply the function in the right Future to the value in the left Future. See https://github.com/fluture-js/Fluture#ap */
93120
export function ap<L, RA>(value: FutureInstance<L, RA>): <RB>(apply: FutureInstance<L, (value: RA) => RB>) => FutureInstance<L, RB>

test/types/alt.test-d.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import {expectType, expectError} from 'tsd';
2+
3+
import * as fl from '../../index.js';
4+
5+
const fsn: fl.FutureInstance<string, number> = fl.resolve (42);
6+
const fns: fl.FutureInstance<number, string> = fl.resolve ('a');
7+
8+
expectType<fl.Never> (fl.alt (fl.never) (fl.never));
9+
expectType<fl.Never> (fl.alt (fl.reject ('a')) (fl.never));
10+
expectType<fl.Never> (fl.alt (fl.resolve ('a')) (fl.never));
11+
expectType<fl.Never> (fl.alt (fl.never) (fl.reject ('a')));
12+
expectType<fl.Resolved<string>> (fl.alt (fl.never) (fl.resolve ('a')));
13+
expectType<fl.Resolved<number>> (fl.alt (fl.reject ('a')) (fl.resolve (42)));
14+
expectType<fl.Resolved<number>> (fl.alt (fl.resolve (42)) (fl.reject ('a')));
15+
expectType<fl.Resolved<number>> (fl.alt (fl.resolve (42)) (fl.resolve (42)));
16+
expectType<fl.Rejected<number>> (fl.alt (fl.reject (42)) (fl.reject (42)));
17+
expectType<fl.Rejected<string>> (fl.alt (fl.reject ('a')) (fl.reject (42)));
18+
expectType<fl.Uncertain<string, number>> (fl.alt (fsn) (fsn));
19+
expectType<fl.Resolved<number>> (fl.alt (fl.resolve ('a')) (fl.resolve (42)));
20+
21+
expectError (fl.alt (fsn) (fns));
22+
23+
const csn: fl.ConcurrentFutureInstance<string, number> = fl.Par (fl.resolve (42));
24+
const cns: fl.ConcurrentFutureInstance<number, string> = fl.Par (fl.resolve ('a'));
25+
26+
expectType<fl.ConcurrentNever> (fl.alt (fl.Par (fl.never)) (fl.Par (fl.never)));
27+
expectType<fl.ConcurrentRejected<string>> (fl.alt (fl.Par (fl.reject ('a'))) (fl.Par (fl.never)));
28+
expectType<fl.ConcurrentResolved<string>> (fl.alt (fl.Par (fl.resolve ('a'))) (fl.Par (fl.never)));
29+
expectType<fl.ConcurrentRejected<string>> (fl.alt (fl.Par (fl.never)) (fl.Par (fl.reject ('a'))));
30+
expectType<fl.ConcurrentResolved<string>> (fl.alt (fl.Par (fl.never)) (fl.Par (fl.resolve ('a'))));
31+
expectType<fl.ConcurrentFutureInstance<string, number>> (fl.alt (fl.Par (fl.reject ('a'))) (fl.Par (fl.resolve (42))));
32+
expectType<fl.ConcurrentFutureInstance<string, number>> (fl.alt (fl.Par (fl.resolve (42))) (fl.Par (fl.reject ('a'))));
33+
expectType<fl.ConcurrentResolved<number>> (fl.alt (fl.Par (fl.resolve (42))) (fl.Par (fl.resolve (42))));
34+
expectType<fl.ConcurrentRejected<number>> (fl.alt (fl.Par (fl.reject (42))) (fl.Par (fl.reject (42))));
35+
expectType<fl.ConcurrentUncertain<string, number>> (fl.alt (csn) (csn));
36+
37+
expectError (fl.alt (fl.Par (fl.resolve ('a'))) (fl.Par (fl.resolve (42))));
38+
expectError (fl.alt (fl.Par (fl.reject ('a'))) (fl.Par (fl.reject (42))));
39+
expectError (fl.alt (csn) (cns));

0 commit comments

Comments
 (0)