import type { AnyTypeValidation, TypeValidation } from '@altostra/type-validations';
import type { Option } from "./Option";
/**
 * Describes a result of an operation that either succeeds or fails.
 */
export declare type Result<TValue, TError> = Failure<TError> | Success<TValue>;
export interface Success<TValue> {
    type: 'result-success';
    value: TValue;
}
export declare function successValidation<T>(valueValidation: AnyTypeValidation<T>): TypeValidation<Success<T>>;
export declare const isSuccess: TypeValidation<Success<unknown>>;
export interface Failure<TError> {
    type: 'result-failure';
    error: TError;
}
export declare function failureValidation<T>(errorValidation: AnyTypeValidation<T>): TypeValidation<Failure<T>>;
export declare const isFailure: TypeValidation<Failure<any>>;
export declare function resultValidation<T, TErr>(valueValidation: AnyTypeValidation<T>, errValidation: AnyTypeValidation<TErr>): TypeValidation<Result<T, TErr>>;
export declare function resultValidation<T>(valueValidation: AnyTypeValidation<T>): TypeValidation<Result<T, any>>;
export declare const isResult: TypeValidation<Result<unknown, any>>;
/**
 * Describes an operation that partially succeeded.
 * T is the partial result, E[] is the list of errors encountered
 * while getting the result.
 */
export declare type PartialSuccess<TValue, TError> = [TValue, TError[]];
export declare function partialSuccessValidation<TValue, TError>(valueValidation: AnyTypeValidation<TValue>, errValidation: AnyTypeValidation<TError>): TypeValidation<PartialSuccess<TValue, TError>>;
export declare function partialSuccessValidation<TValue>(valueValidation: AnyTypeValidation<TValue>): TypeValidation<PartialSuccess<TValue, any>>;
export declare const isPartialSuccess: TypeValidation<PartialSuccess<unknown, any>>;
export declare function partialSuccess<TValue, TError>(value: TValue, errors: TError[]): PartialSuccess<TValue, TError>;
export declare function success<TValue>(value: TValue): Success<TValue>;
export declare function failure<TError>(error: TError): Failure<TError>;
export declare function fromSuccess<TValue>(success: Success<TValue>): TValue;
export declare function fromFailure<TError>(failure: Failure<TError>): TError;
export declare function fromOption<T>(opt: Option<T>): Result<T, void>;
/**
 * Extracts result data from result object. \
 * Throwing an error if the result object is a failed result
 * @param result The result object to extract the result from
 * @returns The result encapsulated in the result object
 */
export declare function fromResult<TValue, TError>(result: Result<TValue, TError>): TValue;
/**
 * * Extracts result data from `PartialSuccess` object.
 * @param result A `PartialSuccess` result object that contain result and optional errors
 * @param throwOnError Specify `true` to throw an error if the result object has at least one error.\
 * Otherwise `false`.
 * @returns The result encapsulated in the result object
 */
export declare function fromResult<TValue, TError>(result: PartialSuccess<TValue, TError>, throwOnError: boolean): TValue;
/**
 * Extracts result data from result object. \
 * Throwing an error if the result object is a failed result
 * @param result The result object to extract the result from
 * @returns The result encapsulated in the result object
 */
export declare function fromSimpleResult<TValue, TError>(result: Result<TValue, TError>): TValue;
/**
 * * Extracts result data from `PartialSuccess` object.
 * @param result A `PartialSuccess` result object that contain result and optional errors
 * @param throwOnError Specify `true` to throw an error if the result object has at least one error.\
 * Otherwise `false`.
 * @returns The result encapsulated in the result object
 */
export declare function fromPartialResult<TValue, TError>(result: PartialSuccess<TValue, TError>, throwOnError: boolean): TValue;
