@hazae41/result
Version:
Rust-like Result for TypeScript
253 lines (250 loc) • 6.77 kB
JavaScript
var err = require('./err.cjs');
var errors = require('./errors.cjs');
var ok = require('./ok.cjs');
exports.Result = void 0;
(function (Result) {
/**
* Create a Result from a maybe Error value
* @param inner
* @returns `Ok<T>` if `T`, `Err<Error>` if `Error`
*/
function from(inner) {
if (inner instanceof Error)
return new err.Err(inner);
else
return new ok.Ok(inner);
}
Result.from = from;
/**
* Create a Result from a boolean
* @param value
* @returns
*/
function assert(value) {
return value ? ok.Ok.void() : err.Err.void();
}
Result.assert = assert;
function rewrap(wrapper) {
try {
return new ok.Ok(wrapper.getOrThrow());
}
catch (error) {
return new err.Err(error);
}
}
Result.rewrap = rewrap;
/**
* Catch an Err thrown from Err.throw
* @param callback
* @param type
* @returns `Ok<T>` if no `Err` was thrown, `Err<E>` otherwise
* @see Err.throw
*/
async function unthrow(callback) {
let ref;
try {
return await callback((e) => ref = e);
}
catch (e) {
if (ref !== undefined)
return ref;
throw e;
}
}
Result.unthrow = unthrow;
/**
* Catch an Err thrown from Err.throw
* @param callback
* @param type
* @returns `Ok<T>` if no `Err` was thrown, `Err<E>` otherwise
* @see Err.throw
*/
function unthrowSync(callback) {
let ref;
try {
return callback((e) => ref = e);
}
catch (e) {
if (ref !== undefined)
return ref;
throw e;
}
}
Result.unthrowSync = unthrowSync;
/**
* Run a callback and wrap any returned value in Ok<T> and any thrown error in Err<unknown>
* @param callback
* @returns
*/
async function runAndWrap(callback) {
try {
return new ok.Ok(await callback());
}
catch (e) {
return new err.Err(e);
}
}
Result.runAndWrap = runAndWrap;
/**
* Run a callback and wrap any returned value in Ok<T> and any thrown error in Err<unknown>
* @param callback
* @returns
*/
function runAndWrapSync(callback) {
try {
return new ok.Ok(callback());
}
catch (e) {
return new err.Err(e);
}
}
Result.runAndWrapSync = runAndWrapSync;
/**
* Run a callback and wrap any returned value in Ok<T> and any thrown error in Err<Catched>
* @param callback
* @returns
*/
async function runAndDoubleWrap(callback) {
try {
return new ok.Ok(await callback());
}
catch (e) {
return new err.Err(errors.Catched.wrap(e));
}
}
Result.runAndDoubleWrap = runAndDoubleWrap;
/**
* Run a callback and wrap any returned value in Ok<T> and any thrown error in Err<Catched>
* @param callback
* @returns
*/
function runAndDoubleWrapSync(callback) {
try {
return new ok.Ok(callback());
}
catch (e) {
return new err.Err(errors.Catched.wrap(e));
}
}
Result.runAndDoubleWrapSync = runAndDoubleWrapSync;
/**
* Run a callback and wrap any thrown error in Err<unknown>
* @param callback
* @returns
*/
async function runOrWrap(callback) {
try {
return await callback();
}
catch (e) {
return new err.Err(e);
}
}
Result.runOrWrap = runOrWrap;
/**
* Run a callback and wrap any thrown error in Err<unknown>
* @param callback
* @returns
*/
function runOrWrapSync(callback) {
try {
return callback();
}
catch (e) {
return new err.Err(e);
}
}
Result.runOrWrapSync = runOrWrapSync;
/**
* Run a callback and wrap any thrown error in Err<unknown>
* @param callback
* @returns
*/
async function runOrDoubleWrap(callback) {
try {
return await callback();
}
catch (e) {
return new err.Err(errors.Catched.wrap(e));
}
}
Result.runOrDoubleWrap = runOrDoubleWrap;
/**
* Run a callback and wrap any thrown error in Err<unknown>
* @param callback
* @returns
*/
function runOrDoubleWrapSync(callback) {
try {
return callback();
}
catch (e) {
return new err.Err(errors.Catched.wrap(e));
}
}
Result.runOrDoubleWrapSync = runOrDoubleWrapSync;
/**
* Transform `Iterable<Result<T,E>` into `Result<Array<T>, E>`
* @param iterable
* @returns `Result<Array<T>, E>`
*/
function all(iterable) {
return collect(iterate(iterable));
}
Result.all = all;
function maybeAll(iterable) {
return maybeCollect(maybeIterate(iterable));
}
Result.maybeAll = maybeAll;
/**
* Transform `Iterable<Result<T,E>` into `Iterator<T, Result<void, E>>`
* @param iterable
* @returns `Iterator<T, Result<void, E>>`
*/
function* iterate(iterable) {
for (const result of iterable) {
if (result.isOk())
yield result.get();
else
return result;
}
return ok.Ok.void();
}
Result.iterate = iterate;
function* maybeIterate(iterable) {
for (const result of iterable) {
if (result == null)
return result;
else if (result.isOk())
yield result.get();
else
return result;
}
return ok.Ok.void();
}
Result.maybeIterate = maybeIterate;
/**
* Transform `Iterator<T, Result<void, E>>` into `Result<Array<T>, E>`
* @param iterator `Result<Array<T>, E>`
*/
function collect(iterator) {
const array = new Array();
let result = iterator.next();
for (; !result.done; result = iterator.next())
array.push(result.value);
return result.value.set(array);
}
Result.collect = collect;
function maybeCollect(iterator) {
const array = new Array();
let result = iterator.next();
for (; !result.done; result = iterator.next())
array.push(result.value);
if (result.value == null)
return;
return result.value.set(array);
}
Result.maybeCollect = maybeCollect;
})(exports.Result || (exports.Result = {}));
//# sourceMappingURL=result.cjs.map
;