generic-result-type 2.2.1 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.mts","../src/errorResult.mts","../src/successResult.mts"],"sourcesContent":["import type { IErrorResult } from './errorResult.mjs';\nimport { ErrorResult } from './errorResult.mjs';\nimport type { Result } from './result.mjs';\nimport type { ISuccessResult } from './successResult.mjs';\nimport { SuccessResult } from './successResult.mjs';\n\nexport type { Result, ISuccessResult, IErrorResult };\n\nexport function success(): ISuccessResult;\nexport function success<T>(value: T): ISuccessResult<T>;\nexport function success<T>(value?: T): ISuccessResult<T> {\n return new SuccessResult(value as T);\n};\n\nexport function fail<E>(error: E): IErrorResult<E> {\n return new ErrorResult(error);\n}\n\nexport const isSuccessResult = <T, E = Error>(result: Result<T, E>): result is ISuccessResult<T> => {\n return result.success;\n};\n\nexport const isErrorResult = <T, E = Error>(result: Result<T, E>): result is IErrorResult<E> => {\n return !result.success;\n};\n\nexport function combine(results: Result<unknown, unknown>[]): Result<unknown[], unknown[]> {\n const values: unknown[] = [];\n const errors: unknown[] = [];\n\n for (const r of results) {\n if (r.success) {\n values.push(r.value);\n } else {\n errors.push(r.error);\n }\n }\n\n if (errors.length) {\n return new ErrorResult(errors);\n }\n return new SuccessResult(values);\n}\n\nexport const flatten = (result: Result<unknown, unknown>): Result<unknown, unknown> => {\n if (isSuccessResult(result)) {\n return getValue(result);\n }\n return getError(result);\n};\n\nconst getValue = (result: SuccessResult<unknown>): Result<unknown, unknown> => {\n // value is a SuccessResult, drill down\n if (result.value instanceof SuccessResult) {\n return getValue(result.value);\n }\n\n // value is an ErrorResult, drill down\n if (result.value instanceof ErrorResult) {\n return getError(result.value);\n }\n\n // value is not a Result, return current SuccessResult\n return result;\n};\n\nconst getError = (result: ErrorResult<unknown>): ErrorResult<unknown> => {\n // error is a SuccessResult, consider this SuccessResult's value\n if (result.error instanceof SuccessResult) {\n const value = getValue(result.error);\n\n // if the value is a SuccessResult, swallow it into an error\n if (isSuccessResult(value)) {\n return fail(value);\n }\n\n // otherwise the value is an ErrorResult, return it\n return value;\n }\n\n // error is an ErrorResult, swallow it\n if (result.error instanceof ErrorResult) {\n return getError(result.error);\n }\n\n // error is not a Result, the current ErrorResult\n return result;\n};\n","import type { IResult } from './result.mjs';\n\nexport interface IErrorResult<E = Error> extends IResult<never, E> {\n readonly success: false;\n readonly error: E;\n\n /**\n * Returns a new `ErrorResult` with the same `error` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly map: <M>(mapFunction: (value: never) => M) => IErrorResult<E>;\n\n /**\n * Asynchronously returns a new `ErrorResult` with the same `error` property as this one.\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<IErrorResult<E>>;\n\n /**\n * Calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErr: <M>(mapFunction: (value: E) => M) => IErrorResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (value: E) => Promise<M>) => Promise<IErrorResult<M>>;\n}\n\nexport class ErrorResult<E> implements IResult<never, E>, IErrorResult<E> {\n public readonly success = false as const;\n\n public constructor(public readonly error: E) { /* empty */ }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters\n public map<M>(mapFunction: (error: never) => M): ErrorResult<E> {\n return new ErrorResult(this.error);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<ErrorResult<E>> {\n return Promise.resolve(new ErrorResult(this.error));\n }\n\n public mapErr<M>(mapFunction: (error: E) => M): ErrorResult<M> {\n return new ErrorResult(mapFunction(this.error));\n }\n\n public async mapErrAsync<M>(mapFunction: (value: E) => Promise<M>): Promise<ErrorResult<M>> {\n return new ErrorResult(await mapFunction(this.error));\n }\n}\n","import type { IResult } from './result.mjs';\n\nexport interface ISuccessResult<T = void> {\n readonly success: true;\n readonly value: T;\n\n /**\n * Calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly map: <M>(mapFunction: (value: T) => M) => ISuccessResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: T) => Promise<M>) => Promise<ISuccessResult<M>>;\n\n /**\n * Returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly mapErr: <M>(mapFunction: (value: never) => M) => ISuccessResult<T>;\n\n /**\n * Asynchronously returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<ISuccessResult<T>>;\n}\n\nexport class SuccessResult<T = void> implements IResult<T, never>, ISuccessResult<T> {\n public readonly success = true as const;\n public readonly value: T;\n\n public constructor(value?: T) {\n this.value = value as T;\n }\n\n public map<M>(mapFunction: (value: T) => M): SuccessResult<M> {\n return new SuccessResult(mapFunction(this.value));\n }\n\n public async mapAsync<M>(mapFunction: (value: T) => Promise<M>): Promise<SuccessResult<M>> {\n return new SuccessResult(await mapFunction(this.value));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters\n public mapErr<M>(mapFunction: (error: never) => M): SuccessResult<T> {\n return new SuccessResult(this.value);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapErrAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<SuccessResult<T>> {\n return Promise.resolve(new SuccessResult(this.value));\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACuCO,IAAM,cAAN,MAAM,aAA6D;AAAA,EAGjE,YAA4B,OAAU;AAAV;AAFnC,SAAgB,UAAU;AAAA,EAEiC;AAAA;AAAA,EAGpD,IAAO,aAAkD;AAC9D,WAAO,IAAI,aAAY,KAAK,KAAK;AAAA,EACnC;AAAA;AAAA,EAGO,SAAY,aAAoE;AACrF,WAAO,QAAQ,QAAQ,IAAI,aAAY,KAAK,KAAK,CAAC;AAAA,EACpD;AAAA,EAEO,OAAU,aAA8C;AAC7D,WAAO,IAAI,aAAY,YAAY,KAAK,KAAK,CAAC;AAAA,EAChD;AAAA,EAEA,MAAa,YAAe,aAAgE;AAC1F,WAAO,IAAI,aAAY,MAAM,YAAY,KAAK,KAAK,CAAC;AAAA,EACtD;AACF;;;ACtBO,IAAM,gBAAN,MAAM,eAAwE;AAAA,EAI5E,YAAY,OAAW;AAH9B,SAAgB,UAAU;AAIxB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEO,IAAO,aAAgD;AAC5D,WAAO,IAAI,eAAc,YAAY,KAAK,KAAK,CAAC;AAAA,EAClD;AAAA,EAEA,MAAa,SAAY,aAAkE;AACzF,WAAO,IAAI,eAAc,MAAM,YAAY,KAAK,KAAK,CAAC;AAAA,EACxD;AAAA;AAAA,EAGO,OAAU,aAAoD;AACnE,WAAO,IAAI,eAAc,KAAK,KAAK;AAAA,EACrC;AAAA;AAAA,EAGO,YAAe,aAAsE;AAC1F,WAAO,QAAQ,QAAQ,IAAI,eAAc,KAAK,KAAK,CAAC;AAAA,EACtD;AACF;;;AFtDO,SAAS,QAAW,OAA8B;AACvD,SAAO,IAAI,cAAc,KAAU;AACrC;AAEO,SAAS,KAAQ,OAA2B;AACjD,SAAO,IAAI,YAAY,KAAK;AAC9B;AAEO,IAAM,kBAAkB,CAAe,WAAsD;AAClG,SAAO,OAAO;AAChB;AAEO,IAAM,gBAAgB,CAAe,WAAoD;AAC9F,SAAO,CAAC,OAAO;AACjB;AAEO,SAAS,QAAQ,SAAmE;AACzF,QAAM,SAAoB,CAAC;AAC3B,QAAM,SAAoB,CAAC;AAE3B,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,SAAS;AACb,aAAO,KAAK,EAAE,KAAK;AAAA,IACrB,OAAO;AACL,aAAO,KAAK,EAAE,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ;AACjB,WAAO,IAAI,YAAY,MAAM;AAAA,EAC/B;AACA,SAAO,IAAI,cAAc,MAAM;AACjC;AAEO,IAAM,UAAU,CAAC,WAA+D;AACrF,MAAI,gBAAgB,MAAM,GAAG;AAC3B,WAAO,SAAS,MAAM;AAAA,EACxB;AACA,SAAO,SAAS,MAAM;AACxB;AAEA,IAAM,WAAW,CAAC,WAA6D;AAE7E,MAAI,OAAO,iBAAiB,eAAe;AACzC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,MAAI,OAAO,iBAAiB,aAAa;AACvC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,SAAO;AACT;AAEA,IAAM,WAAW,CAAC,WAAuD;AAEvE,MAAI,OAAO,iBAAiB,eAAe;AACzC,UAAM,QAAQ,SAAS,OAAO,KAAK;AAGnC,QAAI,gBAAgB,KAAK,GAAG;AAC1B,aAAO,KAAK,KAAK;AAAA,IACnB;AAGA,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,iBAAiB,aAAa;AACvC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/index.mts","../src/errorResult.mts","../src/successResult.mts"],"sourcesContent":["import type { IErrorResult } from './errorResult.mjs';\nimport { ErrorResult } from './errorResult.mjs';\nimport type { Result } from './result.mjs';\nimport type { ISuccessResult } from './successResult.mjs';\nimport { SuccessResult } from './successResult.mjs';\n\nexport type { Result, ISuccessResult, IErrorResult };\n\nexport function success(): ISuccessResult;\nexport function success<T>(value: T): ISuccessResult<T>;\nexport function success<T>(value?: T): ISuccessResult<T> {\n return new SuccessResult(value as T);\n};\n\nexport function fail<E>(error: E): IErrorResult<E> {\n return new ErrorResult(error);\n}\n\nexport const isSuccessResult = <T, E = Error>(result: Result<T, E>): result is ISuccessResult<T> => {\n return result.success;\n};\n\nexport const isErrorResult = <T, E = Error>(result: Result<T, E>): result is IErrorResult<E> => {\n return !result.success;\n};\n\nexport function combine(results: Result<unknown, unknown>[]): Result<unknown[], unknown[]> {\n const values: unknown[] = [];\n const errors: unknown[] = [];\n\n for (const r of results) {\n if (r.success) {\n values.push(r.value);\n } else {\n errors.push(r.error);\n }\n }\n\n if (errors.length) {\n return new ErrorResult(errors);\n }\n return new SuccessResult(values);\n}\n\nexport const flatten = (result: Result<unknown, unknown>): Result<unknown, unknown> => {\n if (isSuccessResult(result)) {\n return getValue(result);\n }\n return getError(result);\n};\n\nconst getValue = (result: SuccessResult<unknown>): Result<unknown, unknown> => {\n // value is a SuccessResult, drill down\n if (result.value instanceof SuccessResult) {\n return getValue(result.value);\n }\n\n // value is an ErrorResult, drill down\n if (result.value instanceof ErrorResult) {\n return getError(result.value);\n }\n\n // value is not a Result, return current SuccessResult\n return result;\n};\n\nconst getError = (result: ErrorResult<unknown>): ErrorResult<unknown> => {\n // error is a SuccessResult, consider this SuccessResult's value\n if (result.error instanceof SuccessResult) {\n const value = getValue(result.error);\n\n // if the value is a SuccessResult, swallow it into an error\n if (isSuccessResult(value)) {\n return fail(value);\n }\n\n // otherwise the value is an ErrorResult, return it\n return value;\n }\n\n // error is an ErrorResult, swallow it\n if (result.error instanceof ErrorResult) {\n return getError(result.error);\n }\n\n // error is not a Result, the current ErrorResult\n return result;\n};\n","import type { IResult } from './result.mjs';\n\nexport interface IErrorResult<E = Error> extends IResult<never, E> {\n readonly success: false;\n readonly error: E;\n\n /**\n * Returns a new `ErrorResult` with the same `error` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly map: <M>(mapFunction: (value: never) => M) => IErrorResult<E>;\n\n /**\n * Asynchronously returns a new `ErrorResult` with the same `error` property as this one.\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<IErrorResult<E>>;\n\n /**\n * Calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErr: <M>(mapFunction: (error: E) => M) => IErrorResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (error: E) => Promise<M>) => Promise<IErrorResult<M>>;\n}\n\nexport class ErrorResult<E> implements IResult<never, E>, IErrorResult<E> {\n public readonly success = false as const;\n\n public constructor(public readonly error: E) { /* empty */ }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters\n public map<M>(mapFunction: (value: never) => M): ErrorResult<E> {\n return new ErrorResult(this.error);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<ErrorResult<E>> {\n return Promise.resolve(new ErrorResult(this.error));\n }\n\n public mapErr<M>(mapFunction: (error: E) => M): ErrorResult<M> {\n return new ErrorResult(mapFunction(this.error));\n }\n\n public async mapErrAsync<M>(mapFunction: (error: E) => Promise<M>): Promise<ErrorResult<M>> {\n return new ErrorResult(await mapFunction(this.error));\n }\n}\n","import type { IResult } from './result.mjs';\n\nexport interface ISuccessResult<T = void> {\n readonly success: true;\n readonly value: T;\n\n /**\n * Calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly map: <M>(mapFunction: (value: T) => M) => ISuccessResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: T) => Promise<M>) => Promise<ISuccessResult<M>>;\n\n /**\n * Returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly mapErr: <M>(mapFunction: (error: never) => M) => ISuccessResult<T>;\n\n /**\n * Asynchronously returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (error: never) => Promise<M>) => Promise<ISuccessResult<T>>;\n}\n\nexport class SuccessResult<T = void> implements IResult<T, never>, ISuccessResult<T> {\n public readonly success = true as const;\n public readonly value: T;\n\n public constructor(value?: T) {\n this.value = value as T;\n }\n\n public map<M>(mapFunction: (value: T) => M): SuccessResult<M> {\n return new SuccessResult(mapFunction(this.value));\n }\n\n public async mapAsync<M>(mapFunction: (value: T) => Promise<M>): Promise<SuccessResult<M>> {\n return new SuccessResult(await mapFunction(this.value));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters\n public mapErr<M>(mapFunction: (error: never) => M): SuccessResult<T> {\n return new SuccessResult(this.value);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapErrAsync<M>(mapFunction: (error: never) => Promise<M>): Promise<SuccessResult<T>> {\n return Promise.resolve(new SuccessResult(this.value));\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACuCO,IAAM,cAAN,MAAM,aAA6D;AAAA,EAGjE,YAA4B,OAAU;AAAV;AAFnC,SAAgB,UAAU;AAAA,EAEiC;AAAA;AAAA,EAGpD,IAAO,aAAkD;AAC9D,WAAO,IAAI,aAAY,KAAK,KAAK;AAAA,EACnC;AAAA;AAAA,EAGO,SAAY,aAAoE;AACrF,WAAO,QAAQ,QAAQ,IAAI,aAAY,KAAK,KAAK,CAAC;AAAA,EACpD;AAAA,EAEO,OAAU,aAA8C;AAC7D,WAAO,IAAI,aAAY,YAAY,KAAK,KAAK,CAAC;AAAA,EAChD;AAAA,EAEA,MAAa,YAAe,aAAgE;AAC1F,WAAO,IAAI,aAAY,MAAM,YAAY,KAAK,KAAK,CAAC;AAAA,EACtD;AACF;;;ACtBO,IAAM,gBAAN,MAAM,eAAwE;AAAA,EAI5E,YAAY,OAAW;AAH9B,SAAgB,UAAU;AAIxB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEO,IAAO,aAAgD;AAC5D,WAAO,IAAI,eAAc,YAAY,KAAK,KAAK,CAAC;AAAA,EAClD;AAAA,EAEA,MAAa,SAAY,aAAkE;AACzF,WAAO,IAAI,eAAc,MAAM,YAAY,KAAK,KAAK,CAAC;AAAA,EACxD;AAAA;AAAA,EAGO,OAAU,aAAoD;AACnE,WAAO,IAAI,eAAc,KAAK,KAAK;AAAA,EACrC;AAAA;AAAA,EAGO,YAAe,aAAsE;AAC1F,WAAO,QAAQ,QAAQ,IAAI,eAAc,KAAK,KAAK,CAAC;AAAA,EACtD;AACF;;;AFtDO,SAAS,QAAW,OAA8B;AACvD,SAAO,IAAI,cAAc,KAAU;AACrC;AAEO,SAAS,KAAQ,OAA2B;AACjD,SAAO,IAAI,YAAY,KAAK;AAC9B;AAEO,IAAM,kBAAkB,CAAe,WAAsD;AAClG,SAAO,OAAO;AAChB;AAEO,IAAM,gBAAgB,CAAe,WAAoD;AAC9F,SAAO,CAAC,OAAO;AACjB;AAEO,SAAS,QAAQ,SAAmE;AACzF,QAAM,SAAoB,CAAC;AAC3B,QAAM,SAAoB,CAAC;AAE3B,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,SAAS;AACb,aAAO,KAAK,EAAE,KAAK;AAAA,IACrB,OAAO;AACL,aAAO,KAAK,EAAE,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ;AACjB,WAAO,IAAI,YAAY,MAAM;AAAA,EAC/B;AACA,SAAO,IAAI,cAAc,MAAM;AACjC;AAEO,IAAM,UAAU,CAAC,WAA+D;AACrF,MAAI,gBAAgB,MAAM,GAAG;AAC3B,WAAO,SAAS,MAAM;AAAA,EACxB;AACA,SAAO,SAAS,MAAM;AACxB;AAEA,IAAM,WAAW,CAAC,WAA6D;AAE7E,MAAI,OAAO,iBAAiB,eAAe;AACzC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,MAAI,OAAO,iBAAiB,aAAa;AACvC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,SAAO;AACT;AAEA,IAAM,WAAW,CAAC,WAAuD;AAEvE,MAAI,OAAO,iBAAiB,eAAe;AACzC,UAAM,QAAQ,SAAS,OAAO,KAAK;AAGnC,QAAI,gBAAgB,KAAK,GAAG;AAC1B,aAAO,KAAK,KAAK;AAAA,IACnB;AAGA,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,iBAAiB,aAAa;AACvC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,SAAO;AACT;","names":[]}
package/dist/index.d.cts CHANGED
@@ -20,14 +20,14 @@ interface ISuccessResult<T = void> {
20
20
  * @param mapFunction the mapping function
21
21
  * @returns a new `SuccessResult`
22
22
  */
23
- readonly mapErr: <M>(mapFunction: (value: never) => M) => ISuccessResult<T>;
23
+ readonly mapErr: <M>(mapFunction: (error: never) => M) => ISuccessResult<T>;
24
24
  /**
25
25
  * Asynchronously returns a new `SuccessResult` with the same `value` property as this one.
26
26
  *
27
27
  * @param mapFunction the mapping function
28
28
  * @returns a new `SuccessResult`
29
29
  */
30
- readonly mapErrAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<ISuccessResult<T>>;
30
+ readonly mapErrAsync: <M>(mapFunction: (error: never) => Promise<M>) => Promise<ISuccessResult<T>>;
31
31
  }
32
32
  declare class SuccessResult<T = void> implements IResult<T, never>, ISuccessResult<T> {
33
33
  readonly success: true;
@@ -36,7 +36,7 @@ declare class SuccessResult<T = void> implements IResult<T, never>, ISuccessResu
36
36
  map<M>(mapFunction: (value: T) => M): SuccessResult<M>;
37
37
  mapAsync<M>(mapFunction: (value: T) => Promise<M>): Promise<SuccessResult<M>>;
38
38
  mapErr<M>(mapFunction: (error: never) => M): SuccessResult<T>;
39
- mapErrAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<SuccessResult<T>>;
39
+ mapErrAsync<M>(mapFunction: (error: never) => Promise<M>): Promise<SuccessResult<T>>;
40
40
  }
41
41
 
42
42
  interface IResult<T, E> {
@@ -97,23 +97,23 @@ interface IErrorResult<E = Error> extends IResult<never, E> {
97
97
  * @param mapFunction the mapping function
98
98
  * @returns a new `ErrorResult`
99
99
  */
100
- readonly mapErr: <M>(mapFunction: (value: E) => M) => IErrorResult<M>;
100
+ readonly mapErr: <M>(mapFunction: (error: E) => M) => IErrorResult<M>;
101
101
  /**
102
102
  * Asynchronously calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.
103
103
  *
104
104
  * @param mapFunction the mapping function
105
105
  * @returns a new `ErrorResult`
106
106
  */
107
- readonly mapErrAsync: <M>(mapFunction: (value: E) => Promise<M>) => Promise<IErrorResult<M>>;
107
+ readonly mapErrAsync: <M>(mapFunction: (error: E) => Promise<M>) => Promise<IErrorResult<M>>;
108
108
  }
109
109
  declare class ErrorResult<E> implements IResult<never, E>, IErrorResult<E> {
110
110
  readonly error: E;
111
111
  readonly success: false;
112
112
  constructor(error: E);
113
- map<M>(mapFunction: (error: never) => M): ErrorResult<E>;
113
+ map<M>(mapFunction: (value: never) => M): ErrorResult<E>;
114
114
  mapAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<ErrorResult<E>>;
115
115
  mapErr<M>(mapFunction: (error: E) => M): ErrorResult<M>;
116
- mapErrAsync<M>(mapFunction: (value: E) => Promise<M>): Promise<ErrorResult<M>>;
116
+ mapErrAsync<M>(mapFunction: (error: E) => Promise<M>): Promise<ErrorResult<M>>;
117
117
  }
118
118
 
119
119
  declare function success(): ISuccessResult;
package/dist/index.d.ts CHANGED
@@ -20,14 +20,14 @@ interface ISuccessResult<T = void> {
20
20
  * @param mapFunction the mapping function
21
21
  * @returns a new `SuccessResult`
22
22
  */
23
- readonly mapErr: <M>(mapFunction: (value: never) => M) => ISuccessResult<T>;
23
+ readonly mapErr: <M>(mapFunction: (error: never) => M) => ISuccessResult<T>;
24
24
  /**
25
25
  * Asynchronously returns a new `SuccessResult` with the same `value` property as this one.
26
26
  *
27
27
  * @param mapFunction the mapping function
28
28
  * @returns a new `SuccessResult`
29
29
  */
30
- readonly mapErrAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<ISuccessResult<T>>;
30
+ readonly mapErrAsync: <M>(mapFunction: (error: never) => Promise<M>) => Promise<ISuccessResult<T>>;
31
31
  }
32
32
  declare class SuccessResult<T = void> implements IResult<T, never>, ISuccessResult<T> {
33
33
  readonly success: true;
@@ -36,7 +36,7 @@ declare class SuccessResult<T = void> implements IResult<T, never>, ISuccessResu
36
36
  map<M>(mapFunction: (value: T) => M): SuccessResult<M>;
37
37
  mapAsync<M>(mapFunction: (value: T) => Promise<M>): Promise<SuccessResult<M>>;
38
38
  mapErr<M>(mapFunction: (error: never) => M): SuccessResult<T>;
39
- mapErrAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<SuccessResult<T>>;
39
+ mapErrAsync<M>(mapFunction: (error: never) => Promise<M>): Promise<SuccessResult<T>>;
40
40
  }
41
41
 
42
42
  interface IResult<T, E> {
@@ -97,23 +97,23 @@ interface IErrorResult<E = Error> extends IResult<never, E> {
97
97
  * @param mapFunction the mapping function
98
98
  * @returns a new `ErrorResult`
99
99
  */
100
- readonly mapErr: <M>(mapFunction: (value: E) => M) => IErrorResult<M>;
100
+ readonly mapErr: <M>(mapFunction: (error: E) => M) => IErrorResult<M>;
101
101
  /**
102
102
  * Asynchronously calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.
103
103
  *
104
104
  * @param mapFunction the mapping function
105
105
  * @returns a new `ErrorResult`
106
106
  */
107
- readonly mapErrAsync: <M>(mapFunction: (value: E) => Promise<M>) => Promise<IErrorResult<M>>;
107
+ readonly mapErrAsync: <M>(mapFunction: (error: E) => Promise<M>) => Promise<IErrorResult<M>>;
108
108
  }
109
109
  declare class ErrorResult<E> implements IResult<never, E>, IErrorResult<E> {
110
110
  readonly error: E;
111
111
  readonly success: false;
112
112
  constructor(error: E);
113
- map<M>(mapFunction: (error: never) => M): ErrorResult<E>;
113
+ map<M>(mapFunction: (value: never) => M): ErrorResult<E>;
114
114
  mapAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<ErrorResult<E>>;
115
115
  mapErr<M>(mapFunction: (error: E) => M): ErrorResult<M>;
116
- mapErrAsync<M>(mapFunction: (value: E) => Promise<M>): Promise<ErrorResult<M>>;
116
+ mapErrAsync<M>(mapFunction: (error: E) => Promise<M>): Promise<ErrorResult<M>>;
117
117
  }
118
118
 
119
119
  declare function success(): ISuccessResult;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errorResult.mts","../src/successResult.mts","../src/index.mts"],"sourcesContent":["import type { IResult } from './result.mjs';\n\nexport interface IErrorResult<E = Error> extends IResult<never, E> {\n readonly success: false;\n readonly error: E;\n\n /**\n * Returns a new `ErrorResult` with the same `error` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly map: <M>(mapFunction: (value: never) => M) => IErrorResult<E>;\n\n /**\n * Asynchronously returns a new `ErrorResult` with the same `error` property as this one.\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<IErrorResult<E>>;\n\n /**\n * Calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErr: <M>(mapFunction: (value: E) => M) => IErrorResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (value: E) => Promise<M>) => Promise<IErrorResult<M>>;\n}\n\nexport class ErrorResult<E> implements IResult<never, E>, IErrorResult<E> {\n public readonly success = false as const;\n\n public constructor(public readonly error: E) { /* empty */ }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters\n public map<M>(mapFunction: (error: never) => M): ErrorResult<E> {\n return new ErrorResult(this.error);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<ErrorResult<E>> {\n return Promise.resolve(new ErrorResult(this.error));\n }\n\n public mapErr<M>(mapFunction: (error: E) => M): ErrorResult<M> {\n return new ErrorResult(mapFunction(this.error));\n }\n\n public async mapErrAsync<M>(mapFunction: (value: E) => Promise<M>): Promise<ErrorResult<M>> {\n return new ErrorResult(await mapFunction(this.error));\n }\n}\n","import type { IResult } from './result.mjs';\n\nexport interface ISuccessResult<T = void> {\n readonly success: true;\n readonly value: T;\n\n /**\n * Calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly map: <M>(mapFunction: (value: T) => M) => ISuccessResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: T) => Promise<M>) => Promise<ISuccessResult<M>>;\n\n /**\n * Returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly mapErr: <M>(mapFunction: (value: never) => M) => ISuccessResult<T>;\n\n /**\n * Asynchronously returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<ISuccessResult<T>>;\n}\n\nexport class SuccessResult<T = void> implements IResult<T, never>, ISuccessResult<T> {\n public readonly success = true as const;\n public readonly value: T;\n\n public constructor(value?: T) {\n this.value = value as T;\n }\n\n public map<M>(mapFunction: (value: T) => M): SuccessResult<M> {\n return new SuccessResult(mapFunction(this.value));\n }\n\n public async mapAsync<M>(mapFunction: (value: T) => Promise<M>): Promise<SuccessResult<M>> {\n return new SuccessResult(await mapFunction(this.value));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters\n public mapErr<M>(mapFunction: (error: never) => M): SuccessResult<T> {\n return new SuccessResult(this.value);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapErrAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<SuccessResult<T>> {\n return Promise.resolve(new SuccessResult(this.value));\n }\n};\n","import type { IErrorResult } from './errorResult.mjs';\nimport { ErrorResult } from './errorResult.mjs';\nimport type { Result } from './result.mjs';\nimport type { ISuccessResult } from './successResult.mjs';\nimport { SuccessResult } from './successResult.mjs';\n\nexport type { Result, ISuccessResult, IErrorResult };\n\nexport function success(): ISuccessResult;\nexport function success<T>(value: T): ISuccessResult<T>;\nexport function success<T>(value?: T): ISuccessResult<T> {\n return new SuccessResult(value as T);\n};\n\nexport function fail<E>(error: E): IErrorResult<E> {\n return new ErrorResult(error);\n}\n\nexport const isSuccessResult = <T, E = Error>(result: Result<T, E>): result is ISuccessResult<T> => {\n return result.success;\n};\n\nexport const isErrorResult = <T, E = Error>(result: Result<T, E>): result is IErrorResult<E> => {\n return !result.success;\n};\n\nexport function combine(results: Result<unknown, unknown>[]): Result<unknown[], unknown[]> {\n const values: unknown[] = [];\n const errors: unknown[] = [];\n\n for (const r of results) {\n if (r.success) {\n values.push(r.value);\n } else {\n errors.push(r.error);\n }\n }\n\n if (errors.length) {\n return new ErrorResult(errors);\n }\n return new SuccessResult(values);\n}\n\nexport const flatten = (result: Result<unknown, unknown>): Result<unknown, unknown> => {\n if (isSuccessResult(result)) {\n return getValue(result);\n }\n return getError(result);\n};\n\nconst getValue = (result: SuccessResult<unknown>): Result<unknown, unknown> => {\n // value is a SuccessResult, drill down\n if (result.value instanceof SuccessResult) {\n return getValue(result.value);\n }\n\n // value is an ErrorResult, drill down\n if (result.value instanceof ErrorResult) {\n return getError(result.value);\n }\n\n // value is not a Result, return current SuccessResult\n return result;\n};\n\nconst getError = (result: ErrorResult<unknown>): ErrorResult<unknown> => {\n // error is a SuccessResult, consider this SuccessResult's value\n if (result.error instanceof SuccessResult) {\n const value = getValue(result.error);\n\n // if the value is a SuccessResult, swallow it into an error\n if (isSuccessResult(value)) {\n return fail(value);\n }\n\n // otherwise the value is an ErrorResult, return it\n return value;\n }\n\n // error is an ErrorResult, swallow it\n if (result.error instanceof ErrorResult) {\n return getError(result.error);\n }\n\n // error is not a Result, the current ErrorResult\n return result;\n};\n"],"mappings":";AAuCO,IAAM,cAAN,MAAM,aAA6D;AAAA,EAGjE,YAA4B,OAAU;AAAV;AAFnC,SAAgB,UAAU;AAAA,EAEiC;AAAA;AAAA,EAGpD,IAAO,aAAkD;AAC9D,WAAO,IAAI,aAAY,KAAK,KAAK;AAAA,EACnC;AAAA;AAAA,EAGO,SAAY,aAAoE;AACrF,WAAO,QAAQ,QAAQ,IAAI,aAAY,KAAK,KAAK,CAAC;AAAA,EACpD;AAAA,EAEO,OAAU,aAA8C;AAC7D,WAAO,IAAI,aAAY,YAAY,KAAK,KAAK,CAAC;AAAA,EAChD;AAAA,EAEA,MAAa,YAAe,aAAgE;AAC1F,WAAO,IAAI,aAAY,MAAM,YAAY,KAAK,KAAK,CAAC;AAAA,EACtD;AACF;;;ACtBO,IAAM,gBAAN,MAAM,eAAwE;AAAA,EAI5E,YAAY,OAAW;AAH9B,SAAgB,UAAU;AAIxB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEO,IAAO,aAAgD;AAC5D,WAAO,IAAI,eAAc,YAAY,KAAK,KAAK,CAAC;AAAA,EAClD;AAAA,EAEA,MAAa,SAAY,aAAkE;AACzF,WAAO,IAAI,eAAc,MAAM,YAAY,KAAK,KAAK,CAAC;AAAA,EACxD;AAAA;AAAA,EAGO,OAAU,aAAoD;AACnE,WAAO,IAAI,eAAc,KAAK,KAAK;AAAA,EACrC;AAAA;AAAA,EAGO,YAAe,aAAsE;AAC1F,WAAO,QAAQ,QAAQ,IAAI,eAAc,KAAK,KAAK,CAAC;AAAA,EACtD;AACF;;;ACtDO,SAAS,QAAW,OAA8B;AACvD,SAAO,IAAI,cAAc,KAAU;AACrC;AAEO,SAAS,KAAQ,OAA2B;AACjD,SAAO,IAAI,YAAY,KAAK;AAC9B;AAEO,IAAM,kBAAkB,CAAe,WAAsD;AAClG,SAAO,OAAO;AAChB;AAEO,IAAM,gBAAgB,CAAe,WAAoD;AAC9F,SAAO,CAAC,OAAO;AACjB;AAEO,SAAS,QAAQ,SAAmE;AACzF,QAAM,SAAoB,CAAC;AAC3B,QAAM,SAAoB,CAAC;AAE3B,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,SAAS;AACb,aAAO,KAAK,EAAE,KAAK;AAAA,IACrB,OAAO;AACL,aAAO,KAAK,EAAE,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ;AACjB,WAAO,IAAI,YAAY,MAAM;AAAA,EAC/B;AACA,SAAO,IAAI,cAAc,MAAM;AACjC;AAEO,IAAM,UAAU,CAAC,WAA+D;AACrF,MAAI,gBAAgB,MAAM,GAAG;AAC3B,WAAO,SAAS,MAAM;AAAA,EACxB;AACA,SAAO,SAAS,MAAM;AACxB;AAEA,IAAM,WAAW,CAAC,WAA6D;AAE7E,MAAI,OAAO,iBAAiB,eAAe;AACzC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,MAAI,OAAO,iBAAiB,aAAa;AACvC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,SAAO;AACT;AAEA,IAAM,WAAW,CAAC,WAAuD;AAEvE,MAAI,OAAO,iBAAiB,eAAe;AACzC,UAAM,QAAQ,SAAS,OAAO,KAAK;AAGnC,QAAI,gBAAgB,KAAK,GAAG;AAC1B,aAAO,KAAK,KAAK;AAAA,IACnB;AAGA,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,iBAAiB,aAAa;AACvC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/errorResult.mts","../src/successResult.mts","../src/index.mts"],"sourcesContent":["import type { IResult } from './result.mjs';\n\nexport interface IErrorResult<E = Error> extends IResult<never, E> {\n readonly success: false;\n readonly error: E;\n\n /**\n * Returns a new `ErrorResult` with the same `error` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly map: <M>(mapFunction: (value: never) => M) => IErrorResult<E>;\n\n /**\n * Asynchronously returns a new `ErrorResult` with the same `error` property as this one.\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<IErrorResult<E>>;\n\n /**\n * Calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErr: <M>(mapFunction: (error: E) => M) => IErrorResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (error: E) => Promise<M>) => Promise<IErrorResult<M>>;\n}\n\nexport class ErrorResult<E> implements IResult<never, E>, IErrorResult<E> {\n public readonly success = false as const;\n\n public constructor(public readonly error: E) { /* empty */ }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters\n public map<M>(mapFunction: (value: never) => M): ErrorResult<E> {\n return new ErrorResult(this.error);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<ErrorResult<E>> {\n return Promise.resolve(new ErrorResult(this.error));\n }\n\n public mapErr<M>(mapFunction: (error: E) => M): ErrorResult<M> {\n return new ErrorResult(mapFunction(this.error));\n }\n\n public async mapErrAsync<M>(mapFunction: (error: E) => Promise<M>): Promise<ErrorResult<M>> {\n return new ErrorResult(await mapFunction(this.error));\n }\n}\n","import type { IResult } from './result.mjs';\n\nexport interface ISuccessResult<T = void> {\n readonly success: true;\n readonly value: T;\n\n /**\n * Calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly map: <M>(mapFunction: (value: T) => M) => ISuccessResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: T) => Promise<M>) => Promise<ISuccessResult<M>>;\n\n /**\n * Returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly mapErr: <M>(mapFunction: (error: never) => M) => ISuccessResult<T>;\n\n /**\n * Asynchronously returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (error: never) => Promise<M>) => Promise<ISuccessResult<T>>;\n}\n\nexport class SuccessResult<T = void> implements IResult<T, never>, ISuccessResult<T> {\n public readonly success = true as const;\n public readonly value: T;\n\n public constructor(value?: T) {\n this.value = value as T;\n }\n\n public map<M>(mapFunction: (value: T) => M): SuccessResult<M> {\n return new SuccessResult(mapFunction(this.value));\n }\n\n public async mapAsync<M>(mapFunction: (value: T) => Promise<M>): Promise<SuccessResult<M>> {\n return new SuccessResult(await mapFunction(this.value));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters\n public mapErr<M>(mapFunction: (error: never) => M): SuccessResult<T> {\n return new SuccessResult(this.value);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapErrAsync<M>(mapFunction: (error: never) => Promise<M>): Promise<SuccessResult<T>> {\n return Promise.resolve(new SuccessResult(this.value));\n }\n};\n","import type { IErrorResult } from './errorResult.mjs';\nimport { ErrorResult } from './errorResult.mjs';\nimport type { Result } from './result.mjs';\nimport type { ISuccessResult } from './successResult.mjs';\nimport { SuccessResult } from './successResult.mjs';\n\nexport type { Result, ISuccessResult, IErrorResult };\n\nexport function success(): ISuccessResult;\nexport function success<T>(value: T): ISuccessResult<T>;\nexport function success<T>(value?: T): ISuccessResult<T> {\n return new SuccessResult(value as T);\n};\n\nexport function fail<E>(error: E): IErrorResult<E> {\n return new ErrorResult(error);\n}\n\nexport const isSuccessResult = <T, E = Error>(result: Result<T, E>): result is ISuccessResult<T> => {\n return result.success;\n};\n\nexport const isErrorResult = <T, E = Error>(result: Result<T, E>): result is IErrorResult<E> => {\n return !result.success;\n};\n\nexport function combine(results: Result<unknown, unknown>[]): Result<unknown[], unknown[]> {\n const values: unknown[] = [];\n const errors: unknown[] = [];\n\n for (const r of results) {\n if (r.success) {\n values.push(r.value);\n } else {\n errors.push(r.error);\n }\n }\n\n if (errors.length) {\n return new ErrorResult(errors);\n }\n return new SuccessResult(values);\n}\n\nexport const flatten = (result: Result<unknown, unknown>): Result<unknown, unknown> => {\n if (isSuccessResult(result)) {\n return getValue(result);\n }\n return getError(result);\n};\n\nconst getValue = (result: SuccessResult<unknown>): Result<unknown, unknown> => {\n // value is a SuccessResult, drill down\n if (result.value instanceof SuccessResult) {\n return getValue(result.value);\n }\n\n // value is an ErrorResult, drill down\n if (result.value instanceof ErrorResult) {\n return getError(result.value);\n }\n\n // value is not a Result, return current SuccessResult\n return result;\n};\n\nconst getError = (result: ErrorResult<unknown>): ErrorResult<unknown> => {\n // error is a SuccessResult, consider this SuccessResult's value\n if (result.error instanceof SuccessResult) {\n const value = getValue(result.error);\n\n // if the value is a SuccessResult, swallow it into an error\n if (isSuccessResult(value)) {\n return fail(value);\n }\n\n // otherwise the value is an ErrorResult, return it\n return value;\n }\n\n // error is an ErrorResult, swallow it\n if (result.error instanceof ErrorResult) {\n return getError(result.error);\n }\n\n // error is not a Result, the current ErrorResult\n return result;\n};\n"],"mappings":";AAuCO,IAAM,cAAN,MAAM,aAA6D;AAAA,EAGjE,YAA4B,OAAU;AAAV;AAFnC,SAAgB,UAAU;AAAA,EAEiC;AAAA;AAAA,EAGpD,IAAO,aAAkD;AAC9D,WAAO,IAAI,aAAY,KAAK,KAAK;AAAA,EACnC;AAAA;AAAA,EAGO,SAAY,aAAoE;AACrF,WAAO,QAAQ,QAAQ,IAAI,aAAY,KAAK,KAAK,CAAC;AAAA,EACpD;AAAA,EAEO,OAAU,aAA8C;AAC7D,WAAO,IAAI,aAAY,YAAY,KAAK,KAAK,CAAC;AAAA,EAChD;AAAA,EAEA,MAAa,YAAe,aAAgE;AAC1F,WAAO,IAAI,aAAY,MAAM,YAAY,KAAK,KAAK,CAAC;AAAA,EACtD;AACF;;;ACtBO,IAAM,gBAAN,MAAM,eAAwE;AAAA,EAI5E,YAAY,OAAW;AAH9B,SAAgB,UAAU;AAIxB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEO,IAAO,aAAgD;AAC5D,WAAO,IAAI,eAAc,YAAY,KAAK,KAAK,CAAC;AAAA,EAClD;AAAA,EAEA,MAAa,SAAY,aAAkE;AACzF,WAAO,IAAI,eAAc,MAAM,YAAY,KAAK,KAAK,CAAC;AAAA,EACxD;AAAA;AAAA,EAGO,OAAU,aAAoD;AACnE,WAAO,IAAI,eAAc,KAAK,KAAK;AAAA,EACrC;AAAA;AAAA,EAGO,YAAe,aAAsE;AAC1F,WAAO,QAAQ,QAAQ,IAAI,eAAc,KAAK,KAAK,CAAC;AAAA,EACtD;AACF;;;ACtDO,SAAS,QAAW,OAA8B;AACvD,SAAO,IAAI,cAAc,KAAU;AACrC;AAEO,SAAS,KAAQ,OAA2B;AACjD,SAAO,IAAI,YAAY,KAAK;AAC9B;AAEO,IAAM,kBAAkB,CAAe,WAAsD;AAClG,SAAO,OAAO;AAChB;AAEO,IAAM,gBAAgB,CAAe,WAAoD;AAC9F,SAAO,CAAC,OAAO;AACjB;AAEO,SAAS,QAAQ,SAAmE;AACzF,QAAM,SAAoB,CAAC;AAC3B,QAAM,SAAoB,CAAC;AAE3B,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,SAAS;AACb,aAAO,KAAK,EAAE,KAAK;AAAA,IACrB,OAAO;AACL,aAAO,KAAK,EAAE,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ;AACjB,WAAO,IAAI,YAAY,MAAM;AAAA,EAC/B;AACA,SAAO,IAAI,cAAc,MAAM;AACjC;AAEO,IAAM,UAAU,CAAC,WAA+D;AACrF,MAAI,gBAAgB,MAAM,GAAG;AAC3B,WAAO,SAAS,MAAM;AAAA,EACxB;AACA,SAAO,SAAS,MAAM;AACxB;AAEA,IAAM,WAAW,CAAC,WAA6D;AAE7E,MAAI,OAAO,iBAAiB,eAAe;AACzC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,MAAI,OAAO,iBAAiB,aAAa;AACvC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,SAAO;AACT;AAEA,IAAM,WAAW,CAAC,WAAuD;AAEvE,MAAI,OAAO,iBAAiB,eAAe;AACzC,UAAM,QAAQ,SAAS,OAAO,KAAK;AAGnC,QAAI,gBAAgB,KAAK,GAAG;AAC1B,aAAO,KAAK,KAAK;AAAA,IACnB;AAGA,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,iBAAiB,aAAa;AACvC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,SAAO;AACT;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "generic-result-type",
3
- "version": "2.2.1",
3
+ "version": "2.2.2",
4
4
  "description": "A generic result wrapper",
5
5
  "license": "ISC",
6
6
  "author": "Dave Welsh",