4.5
Version:
Monadic test assertions
56 lines (46 loc) • 1.41 kB
text/typescript
import { Assertion, Verification } from '../types';
import { curry } from '@typed/curry';
export const bimap: BimapFn = curry(
function bimap<T, R>(
failure: (message: string) => string,
success: (value: T) => R,
assertion: Assertion<T>): Assertion<R>
{
return new BimapAssertion<T, R>(failure, success, assertion);
},
);
export interface BimapFn {
<T, R>(
failure: (message: string) => string,
success: (value: T) => R,
assertion: Assertion<T>): Assertion<R>;
<T, R>(
failure: (message: string) => string):
(success: (value: T) => R,
assertion: Assertion<T>) => Assertion<R>;
<T, R>(
failure: (message: string) => string,
success: (value: T) => R):
(assertion: Assertion<T>) => Assertion<R>;
<T, R>(
failure: (message: string) => string):
(success: (value: T) => R) =>
(assertion: Assertion<T>) => Assertion<R>;
}
class BimapAssertion<T, R> implements Assertion<R> {
constructor(
private failure: (message: string) => string,
private success: (value: T) => R,
private assertion: Assertion<T>) {}
public verify(verification: Verification<R>) {
const { failure, success, assertion } = this;
assertion.verify({
success(value: T) {
verification.success(success(value));
},
failure(message: string) {
verification.failure(failure(message));
},
});
}
}