@synet/patterns
Version:
Robust, battle-tested collection of stable patterns used in Synet packages
61 lines (60 loc) • 2.02 kB
TypeScript
import { Result } from "../patterns/result";
/**
* Extensions for the Result pattern following the Open/Closed Principle.
* These add functionality without modifying the core Result class.
*/
export declare const ResultExtensions: {
/**
* Maps error from one Result type to another, preserving error details
*
* @example
* const emailResult = Email.create(input);
* if (emailResult.isFailure) {
* return ResultExtensions.mapError<Email, User>(emailResult);
* }
*/
mapError<FromType, ToType>(result: Result<FromType>): Result<ToType>;
/**
* Maps a successful result value to a different type
*
* @example
* const userResult = User.create({ name: "John" });
* const userDtoResult = ResultExtensions.mapSuccess(userResult, user => UserDto.fromUser(user));
*/
mapSuccess<FromType, ToType>(result: Result<FromType>, mapper: (value: FromType) => ToType): Result<ToType>;
/**
* Chains multiple results together, short-circuiting on first failure
*
* @example
* const finalResult = ResultExtensions.chain(
* () => validateInput(input),
* (validInput) => processInput(validInput),
* (processedData) => saveToDatabase(processedData)
* );
*/
chain<T1, T2>(result: Result<T1>, fn: (value: T1) => Result<T2>): Result<T2>;
};
/**
* Additional useful Result transformations and combinations
*/
export declare const ResultCombinators: {
/**
* Returns first success result or combines all error messages
*
* @example
* const result = ResultCombinators.any([
* primaryValidator(input),
* fallbackValidator(input)
* ]);
*/
any<T>(results: Result<T>[]): Result<T>;
/**
* Collects all successful results or returns first failure
*
* @example
* const usersResult = ResultCombinators.all(
* userIds.map(id => userRepository.getById(id))
* );
*/
all<T>(results: Result<T>[]): Result<T[]>;
};