Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 3b7922b

Browse files
committedApr 24, 2021
WIP: and
1 parent 7072818 commit 3b7922b

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed
 

Diff for: ‎index.d.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,24 @@ export interface FutureInstance<L, R> extends Functor<R> {
8383
export function after(duration: number): <R>(value: R) => Resolved<R>
8484

8585
/** Logical and for Futures. See https://github.com/fluture-js/Fluture#and */
86-
export function and<L, R>(left: FutureInstance<L, R>): (right: FutureInstance<L, any>) => FutureInstance<L, R>
86+
export const and: {
87+
<F extends AnyFuture, S extends AnyFuture>(second: F extends Never ? S : never): (first: F) => Never
88+
<F extends AnyFuture, S extends AnyFuture>(second: F extends Rejected<unknown> ? S : never): (first: F) => F
89+
<F extends AnyFuture, S extends AnyFuture>(second: F extends Resolved<unknown> ? S : never): (first: F) => S
90+
<F extends AnyFuture, S extends AnyFuture>(second: F extends Uncertain<infer L, unknown> ? S extends Uncertain<L, unknown> ? S : never : never): (first: F) => S
91+
92+
// <L, R>(second: Uncertain<L, R>): {
93+
// <T>(first: Rejected<T>): Rejected<T>
94+
// (first: Resolved<any>): Uncertain<L, R>
95+
// (first: Uncertain<L, any>): Uncertain<L, R>
96+
// }
97+
98+
// <R>(second: Resolved<R>): {
99+
// <L>(first: Rejected<L>): Rejected<L>
100+
// (first: Resolved<any>): Resolved<R>
101+
// <L>(first: Uncertain<L, any>): Uncertain<L, R>
102+
// }
103+
}
87104

88105
/** Logical or for Futures. See https://github.com/fluture-js/Fluture#alt */
89106
export const alt: {

Diff for: ‎test/types/and.test-d.ts

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import {expectType, expectError} from 'tsd';
2+
3+
import * as fl from '../../index.js';
4+
5+
const fsn: fl.Uncertain<string, number> = fl.resolve (42);
6+
const fns: fl.Uncertain<number, string> = fl.resolve ('a');
7+
8+
// Standard usage on Future instances.
9+
// expectType<fl.Never> (fl.and (fl.never) (fl.never));
10+
// expectType<fl.Never> (fl.and (fl.never) (fl.resolve ('a')));
11+
// expectType<fl.Never> (fl.and (fl.reject ('a')) (fl.never));
12+
// expectType<fl.Never> (fl.and (fl.resolve ('a')) (fl.never));
13+
// expectType<fl.Rejected<string>> (fl.and (fl.reject ('a')) (fl.resolve (42)));
14+
// expectType<fl.Resolved<number>> (fl.and (fl.resolve (42)) (fl.resolve (42)));
15+
// expectType<fl.Rejected<number>> (fl.and (fl.reject (42)) (fl.reject (42)));
16+
// expectType<fl.Uncertain<string, number>> (fl.and (fsn) (fsn));
17+
// expectType<fl.Rejected<string>> (fl.and (fl.never) (fl.reject ('a')));
18+
// expectType<fl.Rejected<string>> (fl.and (fl.resolve (42)) (fl.reject ('a')));
19+
// expectType<fl.Rejected<number>> (fl.and (fl.reject ('a')) (fl.reject (42)));
20+
// expectError (fl.and (fsn) (fns));
21+
22+
const x = fl.resolve ('').pipe(fl.and (fl.never))
23+
type T = typeof x
24+
25+
// Usage with pipe on Future instances (https://git.io/JLx3F).
26+
expectType<fl.Never> ((fl.never) .pipe (fl.and (fl.never)));
27+
expectType<fl.Never> ((fl.resolve ('a')) .pipe (fl.and (fl.never)));
28+
expectType<fl.Never> ((fl.never) .pipe (fl.and (fl.reject ('a'))));
29+
expectType<fl.Never> ((fl.never) .pipe (fl.and (fl.resolve ('a'))));
30+
expectType<fl.Rejected<string>> ((fl.resolve (42)) .pipe (fl.and (fl.reject ('a'))));
31+
expectType<fl.Resolved<number>> ((fl.resolve (42)) .pipe (fl.and (fl.resolve (42))));
32+
expectType<fl.Rejected<number>> ((fl.reject (42)) .pipe (fl.and (fl.reject (42))));
33+
expectType<fl.Uncertain<string, number>> ((fsn) .pipe (fl.and (fsn)));
34+
expectType<fl.Rejected<string>> ((fl.reject ('a')) .pipe (fl.and (fl.never)));
35+
expectType<fl.Rejected<string>> ((fl.reject ('a')) .pipe (fl.and (fl.resolve (42))));
36+
expectType<fl.Rejected<number>> ((fl.reject (42)) .pipe (fl.and (fl.reject ('a'))));
37+
expectError ((fns) .pipe (fl.and (fsn)));

0 commit comments

Comments
 (0)
Please sign in to comment.