Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | 145x 27x 156x 14x 3x 2x 1x 2x 1x 1x 5x 4x 1x 3x 1x 2x 4x 1x 3x | /**
* Result type for error handling - represents either success or failure
* This is a discriminated union that forces explicit error handling
*/
export type Result<T, E> = Success<T> | Failure<E>;
export interface Success<T> {
readonly ok: true;
readonly value: T;
}
export interface Failure<E> {
readonly ok: false;
readonly error: E;
}
/**
* Creates a successful Result
*/
export function success<T>(value: T): Success<T> {
return { ok: true, value };
}
/**
* Creates a failed Result
*/
export function failure<E>(error: E): Failure<E> {
return { ok: false, error };
}
/**
* Type guard to check if a Result is successful
*/
export function isSuccess<T, E>(result: Result<T, E>): result is Success<T> {
return result.ok;
}
/**
* Type guard to check if a Result is a failure
*/
export function isFailure<T, E>(result: Result<T, E>): result is Failure<E> {
return !result.ok;
}
/**
* Maps a successful Result's value using the provided function
*/
export function map<T, U, E>(
result: Result<T, E>,
fn: (value: T) => U,
): Result<U, E> {
if (result.ok) {
return success(fn(result.value));
}
return result;
}
/**
* Maps a failed Result's error using the provided function
*/
export function mapError<T, E, F>(
result: Result<T, E>,
fn: (error: E) => F,
): Result<T, F> {
if (!result.ok) {
return failure(fn(result.error));
}
return result;
}
/**
* Chains Result operations - flatMap/bind
*/
export function flatMap<T, U, E>(
result: Result<T, E>,
fn: (value: T) => Result<U, E>,
): Result<U, E> {
if (result.ok) {
return fn(result.value);
}
return result;
}
/**
* Unwraps a Result, throwing if it's a failure
*/
export function unwrap<T, E>(result: Result<T, E>): T {
if (result.ok) {
return result.value;
}
throw new Error(`Attempted to unwrap a failure: ${String(result.error)}`);
}
/**
* Unwraps a Result with a default value for failures
*/
export function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {
if (result.ok) {
return result.value;
}
return defaultValue;
}
|