@@ -10,3 +10,3 @@ export interface Eq<A> { | ||
| export declare function contramap<A, B>(eqA: Eq<A>, f: (b: B) => A): Eq<B>; | ||
| export declare function struct<A extends Record<string, unknown>>(eqs: { | ||
| export declare function struct<A extends object>(eqs: { | ||
| [K in keyof A]: Eq<A[K]>; | ||
@@ -13,0 +13,0 @@ }): Eq<A>; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/eq/index.ts"],"names":[],"mappings":"AAmCA,MAAM,CAAC,MAAM,MAAM,GAAgB;IACjC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM;CAC5C,CAAC;AAGF,MAAM,CAAC,MAAM,MAAM,GAAe,MAAoB,CAAC;AAGvD,MAAM,CAAC,MAAM,MAAM,GAAe,MAAoB,CAAC;AAGvD,MAAM,CAAC,MAAM,OAAO,GAAgB,MAAqB,CAAC;AAG1D,MAAM,CAAC,MAAM,IAAI,GAAa;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,MAAM,CAAC,OAAO,EAAE;CAChE,CAAC;AAUF,MAAM,UAAU,SAAS,CAAO,GAAU,EAAE,CAAc;IACxD,OAAO;QACL,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;KAC3D,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,MAAM,CACpB,GAAiC;IAEjC,OAAO;QACL,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,MAAM,CAAC,GAAG,GAAc,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAe,EAAE,MAAM,CAAC,CAAC,CAAe,CAAC,EAAE,CAAC;oBACpE,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,UAAU,CAAI,GAAU;IACtC,OAAO;QACL,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAM,EAAE,MAAM,CAAC,CAAC,CAAM,CAAC;oBAAE,OAAO,KAAK,CAAC;YAC/D,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAID,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,IAAI;IACJ,SAAS;IACT,MAAM;IACN,UAAU;CACF,CAAC"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/eq/index.ts"],"names":[],"mappings":"AAmCA,MAAM,CAAC,MAAM,MAAM,GAAgB;IACjC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM;CAC5C,CAAC;AAGF,MAAM,CAAC,MAAM,MAAM,GAAe,MAAoB,CAAC;AAGvD,MAAM,CAAC,MAAM,MAAM,GAAe,MAAoB,CAAC;AAGvD,MAAM,CAAC,MAAM,OAAO,GAAgB,MAAqB,CAAC;AAG1D,MAAM,CAAC,MAAM,IAAI,GAAa;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,MAAM,CAAC,OAAO,EAAE;CAChE,CAAC;AAUF,MAAM,UAAU,SAAS,CAAO,GAAU,EAAE,CAAc;IACxD,OAAO;QACL,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;KAC3D,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,MAAM,CAAmB,GAAiC;IACxE,OAAO;QACL,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,MAAM,CAAC,GAAG,GAAc,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAe,EAAE,MAAM,CAAC,CAAC,CAAe,CAAC,EAAE,CAAC;oBACpE,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,UAAU,CAAI,GAAU;IACtC,OAAO;QACL,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAM,EAAE,MAAM,CAAC,CAAC,CAAM,CAAC;oBAAE,OAAO,KAAK,CAAC;YAC/D,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAID,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,IAAI;IACJ,SAAS;IACT,MAAM;IACN,UAAU;CACF,CAAC"} |
@@ -12,3 +12,3 @@ import { type Eq } from '../eq/index.js'; | ||
| export declare function contramap<A, B>(ordA: Ord<A>, f: (b: B) => A): Ord<B>; | ||
| export declare function struct<A extends Record<string, unknown>>(ords: { | ||
| export declare function struct<A extends object>(ords: { | ||
| [K in keyof A]: Ord<A[K]>; | ||
@@ -15,0 +15,0 @@ }): Ord<A>; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ord/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ord/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAW,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAiBjD,MAAM,CAAC,MAAM,MAAM,GAAgB;IACjC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAY,EAAE;QACnC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QACpC,OAAO,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;CACF,CAAC;AAGF,MAAM,CAAC,MAAM,MAAM,GAAgB;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC3E,CAAC;AAGF,MAAM,CAAC,MAAM,OAAO,GAAiB;IACnC,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACpE,CAAC;AAGF,MAAM,CAAC,MAAM,IAAI,GAAc;IAC7B,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,MAAM,CAAC,OAAO,EAAE;IAC/D,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACzB,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;CACF,CAAC;AAWF,MAAM,UAAU,OAAO,CAAI,GAAW;IACpC,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAa;KACpE,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,SAAS,CAAO,IAAY,EAAE,CAAc;IAC1D,OAAO;QACL,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QAC3D,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;KAC9D,CAAC;AACJ,CAAC;AAYD,MAAM,UAAU,MAAM,CAAmB,IAAmC;IAC1E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAmB,CAAC;IACjD,OAAO;QACL,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAC;YAC/D,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACzB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvD,IAAI,GAAG,KAAK,CAAC;oBAAE,OAAO,GAAG,CAAC;YAC5B,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;KACF,CAAC;AACJ,CAAC;AAUD,MAAM,UAAU,MAAM,CAAI,EAAoB,EAAE,GAAW;IACzD,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAKD,MAAM,UAAU,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,MAAS;IACrD,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1D,CAAC;AAKD,MAAM,UAAU,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,MAAS;IACrD,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1D,CAAC;AAKD,MAAM,UAAU,KAAK,CAAI,GAAW,EAAE,KAAQ,EAAE,KAAQ,EAAE,KAAQ;IAChE,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/F,CAAC;AAKD,MAAM,UAAU,OAAO,CAAI,GAAW,EAAE,KAAQ,EAAE,KAAQ,EAAE,KAAQ;IAClE,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1E,CAAC;AAID,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,MAAM;IACN,MAAM;IACN,OAAO;IACP,IAAI;IACJ,OAAO;IACP,SAAS;IACT,MAAM;IACN,MAAM;IACN,GAAG;IACH,GAAG;IACH,KAAK;IACL,OAAO;CACC,CAAC"} |
@@ -17,5 +17,15 @@ import type { AppError } from '../errors/app-error.js'; | ||
| export declare function both<E, A>(error: E, value: A): These<E, A>; | ||
| export declare function isLeft<E, A>(these: These<E, A>): boolean; | ||
| export declare function isRight<E, A>(these: These<E, A>): boolean; | ||
| export declare function isBoth<E, A>(these: These<E, A>): boolean; | ||
| export declare function isLeft<E, A>(these: These<E, A>): these is { | ||
| readonly _tag: 'Left'; | ||
| readonly left: E; | ||
| }; | ||
| export declare function isRight<E, A>(these: These<E, A>): these is { | ||
| readonly _tag: 'Right'; | ||
| readonly right: A; | ||
| }; | ||
| export declare function isBoth<E, A>(these: These<E, A>): these is { | ||
| readonly _tag: 'Both'; | ||
| readonly left: E; | ||
| readonly right: A; | ||
| }; | ||
| export declare function map<E, A, B>(these: These<E, A>, f: (value: A) => B): These<E, B>; | ||
@@ -22,0 +32,0 @@ export declare function mapLeft<E, A, F>(these: These<E, A>, f: (error: E) => F): These<F, A>; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/these/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/these/index.ts"],"names":[],"mappings":"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"} |
+24
-10
@@ -7,15 +7,29 @@ export type Union<T extends Record<string, unknown>> = { | ||
| }[keyof T]; | ||
| type Tagged = { | ||
| readonly tag: PropertyKey; | ||
| readonly value: unknown; | ||
| }; | ||
| export declare const Union: { | ||
| readonly of: <T extends Record<string, unknown>, K extends keyof T>(tag: K, value: T[K]) => Union<T>; | ||
| readonly match: <T extends Record<string, unknown>, R>(union: Union<T>, handlers: { [K in keyof T]: (value: T[K]) => R; }) => R; | ||
| readonly is: <T extends Record<string, unknown>, K extends keyof T>(union: Union<T>, tag: K) => union is { | ||
| tag: K; | ||
| value: T[K]; | ||
| readonly match: <U extends Tagged, R>(union: U, handlers: { [K in U["tag"]]: (value: Extract<U, { | ||
| readonly tag: K; | ||
| }>["value"]) => R; }) => R; | ||
| readonly is: <U extends Tagged, K extends U["tag"]>(union: U, tag: K) => union is Extract<U, { | ||
| readonly tag: K; | ||
| }>; | ||
| readonly get: <U extends Tagged, K extends U["tag"]>(union: U, tag: K) => Extract<U, { | ||
| readonly tag: K; | ||
| }>["value"]; | ||
| readonly partition: <U extends Tagged, K1 extends U["tag"], K2 extends U["tag"]>(items: ReadonlyArray<U>, leftTag: K1, rightTag: K2) => { | ||
| lefts: Array<Extract<U, { | ||
| readonly tag: K1; | ||
| }>["value"]>; | ||
| rights: Array<Extract<U, { | ||
| readonly tag: K2; | ||
| }>["value"]>; | ||
| }; | ||
| readonly get: <T extends Record<string, unknown>, K extends keyof T>(union: Union<T>, tag: K) => T[K]; | ||
| readonly partition: <T extends Record<string, unknown>, K1 extends keyof T, K2 extends keyof T>(items: ReadonlyArray<Union<T>>, leftTag: K1, rightTag: K2) => { | ||
| lefts: Array<T[K1]>; | ||
| rights: Array<T[K2]>; | ||
| }; | ||
| readonly groupBy: <T extends Record<string, unknown>>(items: ReadonlyArray<Union<T>>) => { [K in keyof T]?: Array<T[K]>; }; | ||
| readonly groupBy: <U extends Tagged>(items: ReadonlyArray<U>) => { [K in U["tag"]]?: Array<Extract<U, { | ||
| readonly tag: K; | ||
| }>["value"]>; }; | ||
| }; | ||
| export {}; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"union.js","sourceRoot":"","sources":["../../src/union/union.ts"],"names":[],"mappings":"AAiCA,MAAM,CAAC,MAAM,KAAK,GAAG;IAInB,EAAE,CAAuD,GAAM,EAAE,KAAW;QAC1E,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAa,CAAC;IACnD,CAAC;IAOD,KAAK,CACH,KAAe,EACf,QAAgD;QAEhD,MAAM,OAAO,GAAI,QAA2D,CAC1E,KAAK,CAAC,GAAsB,CAC7B,CAAC;QACF,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxF,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAKD,EAAE,CACA,KAAe,EACf,GAAM;QAEN,OAAO,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;IAC3B,CAAC;IAKD,GAAG,CAAuD,KAAe,EAAE,GAAM;QAC/E,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,KAAK,CAAC,KAAa,CAAC;IAC7B,CAAC;IAgBD,SAAS,CACP,KAA8B,EAC9B,OAAW,EACX,QAAY;QAEZ,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAc,CAAC,CAAC;iBACrD,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ;gBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAc,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC;IAWD,OAAO,CACL,KAA8B;QAE9B,MAAM,MAAM,GAAqC,EAAE,CAAC;QACpD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAc,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,GAAG,EAA0B,CAAC;YAC3C,CAAC;YACA,MAAM,CAAC,GAAG,CAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,KAAsB,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACO,CAAC"} | ||
| {"version":3,"file":"union.js","sourceRoot":"","sources":["../../src/union/union.ts"],"names":[],"mappings":"AAwCA,MAAM,CAAC,MAAM,KAAK,GAAG;IAInB,EAAE,CAAuD,GAAM,EAAE,KAAW;QAC1E,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAa,CAAC;IACnD,CAAC;IAOD,KAAK,CACH,KAAQ,EACR,QAAqF;QAErF,MAAM,OAAO,GAAI,QAA2D,CAC1E,KAAK,CAAC,GAAsB,CAC7B,CAAC;QACF,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxF,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAKD,EAAE,CACA,KAAQ,EACR,GAAM;QAEN,OAAO,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;IAC3B,CAAC;IAKD,GAAG,CACD,KAAQ,EACR,GAAM;QAEN,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,KAAK,CAAC,KAAiD,CAAC;IACjE,CAAC;IAgBD,SAAS,CACP,KAAuB,EACvB,OAAW,EACX,QAAY;QAKZ,MAAM,KAAK,GAAqD,EAAE,CAAC;QACnE,MAAM,MAAM,GAAqD,EAAE,CAAC;QACpE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAkD,CAAC,CAAC;iBACzF,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ;gBAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAkD,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC;IAWD,OAAO,CACL,KAAuB;QAEvB,MAAM,MAAM,GAAwC,EAAE,CAAC;QACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACnB,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,MAA+E,CAAC;IACzF,CAAC;CACO,CAAC"} |
+1
-1
| { | ||
| "name": "tsentials", | ||
| "version": "0.1.10", | ||
| "version": "0.1.11", | ||
| "description": "Railway-oriented programming for TypeScript — Result<T>, Maybe<T>, Rule Engine, and DDD base classes with full async pipeline support", | ||
@@ -5,0 +5,0 @@ "type": "module", |
+169
-52
@@ -16,3 +16,3 @@ <p align="center"> | ||
| Railway-oriented programming for TypeScript — `Result<T>`, `Maybe<T>`, Rule Engine, and DDD base classes with full async pipeline support. | ||
| Railway-oriented programming for TypeScript: `Result<T>`, `Maybe<T>`, Rule Engine, and DDD base classes with full async pipeline support. | ||
@@ -22,3 +22,3 @@ --- | ||
| > **[Your Function Signature Is Lying →](https://www.senrecep.com/en/blog/your-function-signature-is-lying)** | ||
| > A deep dive into why `try/catch` falls short in TypeScript, the philosophy behind Railway Oriented Programming, and the design decisions that shaped `tsentials`. | ||
| > Why `try/catch` falls short in TypeScript, the thinking behind Railway Oriented Programming, and the design decisions that shaped `tsentials`. | ||
@@ -103,3 +103,3 @@ --- | ||
| Discriminated union `{ ok: true; value: T } | { ok: false; errors: AppError[] }`. No exceptions — errors are values. | ||
| Discriminated union `{ ok: true; value: T } | { ok: false; errors: AppError[] }`. Errors are values, not exceptions. | ||
@@ -136,9 +136,10 @@ ### Creating Results | ||
| ```typescript | ||
| import { Result } from 'tsentials/result'; | ||
| import { Result, chain } from 'tsentials/result'; | ||
| import { Err } from 'tsentials/errors'; | ||
| const price = Result.success(100) | ||
| |> Result.map(_, n => n * 1.2) | ||
| |> Result.ensure(_, n => n < 200, Err.validation('Price.TooHigh', 'Exceeds limit')) | ||
| |> Result.map(_, n => `$${n.toFixed(2)}`); | ||
| const price = chain(Result.success(100)) | ||
| .map(n => n * 1.2) | ||
| .ensure(n => n < 200, Err.validation('Price.TooHigh', 'Exceeds limit')) | ||
| .map(n => `$${n.toFixed(2)}`) | ||
| .unwrap(); | ||
| // => { ok: true, value: "$120.00" } | ||
@@ -217,3 +218,3 @@ | ||
| `ResultAsync<T>` implements `PromiseLike<Result<T>>` — the entire chain builds synchronously, resolves once at the end with a single `await`. | ||
| `ResultAsync<T>` implements `PromiseLike<Result<T>>`. The entire chain builds synchronously and resolves once at the end with a single `await`. | ||
@@ -224,2 +225,3 @@ ```typescript | ||
| // fromAsync takes a Promise<Result<T>> — here fetchUser returns Promise<Result<User>> | ||
| const profile = await fromAsync(fetchUser(userId)) | ||
@@ -239,14 +241,15 @@ .andThen(user => validateUser(user)) | ||
| ```typescript | ||
| // Conditional async bind | ||
| // Conditional async bind — the bind fn preserves T; when the condition is | ||
| // false the original Result<T> passes through unchanged | ||
| await Result.bindIfAsync( | ||
| Result.success(user), | ||
| u => u.isAdmin, | ||
| async u => fetchAdminDashboard(u), | ||
| async u => loadAdminProfile(u), // (u: User) => Promise<Result<User>> | ||
| ); | ||
| // Async recovery | ||
| // Async recovery — the recovery fn returns the same Result<T> | ||
| await Result.recoverAsync( | ||
| Result.failure(cacheMiss), | ||
| e => e.code === 'Cache.Miss', | ||
| async () => fetchFromDatabase(), | ||
| async () => fetchFromDatabase(), // () => Promise<Result<T>> | ||
| ); | ||
@@ -303,3 +306,3 @@ ``` | ||
| Explicit optional values — no accidental `undefined`. | ||
| Explicit optional values instead of accidental `undefined`. | ||
@@ -530,3 +533,3 @@ ### Creating Maybe Values | ||
| `fetchResult` never throws — network errors and HTTP error responses are captured as `Result<T>`. | ||
| `fetchResult` never throws. It captures network errors and HTTP error responses as `Result<T>`. | ||
@@ -594,2 +597,3 @@ ```typescript | ||
| import { Union } from 'tsentials/union'; | ||
| import type { AppError } from 'tsentials/errors'; | ||
@@ -602,3 +606,5 @@ type PaymentResult = Union<{ | ||
| const result = Union.of<{ success: { transactionId: string }; pending: { estimatedMs: number }; failed: { error: AppError } }>('success', { transactionId: 'txn_123' }); | ||
| // Construct with `as PaymentResult` (not `: PaymentResult`) for fresh literals — | ||
| // assignment narrowing would otherwise pin the value to a single member. | ||
| const result = { tag: 'success', value: { transactionId: 'txn_123' } } as PaymentResult; | ||
@@ -611,3 +617,3 @@ const message = Union.match(result, { | ||
| // Type guard | ||
| // Type guard — narrows to the tagged member | ||
| if (Union.is(result, 'success')) { | ||
@@ -620,9 +626,17 @@ console.log(result.value.transactionId); | ||
| // Collection utilities | ||
| type Shape = Union<{ circle: { radius: number }; rect: { w: number; h: number } }>; | ||
| const shapes: Shape[] = [ | ||
| { tag: 'circle', value: { radius: 1 } }, | ||
| { tag: 'rect', value: { w: 2, h: 3 } }, | ||
| { tag: 'circle', value: { radius: 4 } }, | ||
| ]; | ||
| // partition: split union array into two typed arrays by tag | ||
| const { lefts, rights } = Union.partition(shapes, 'circle', 'rect'); | ||
| // lefts: Array<{ radius: number }>, rights: Array<{ w: number; h: number }> | ||
| // lefts: Array<{ radius: number }> (2 items), rights: Array<{ w: number; h: number }> (1 item) | ||
| // groupBy: group all items by tag into a record | ||
| const groups = Union.groupBy(shapes); | ||
| // { circle: [...], rect: [...] } | ||
| // { circle: [{ radius: 1 }, { radius: 4 }], rect: [{ w: 2, h: 3 }] } | ||
| ``` | ||
@@ -659,4 +673,4 @@ | ||
| `deepClone` uses the native `structuredClone` API when available, falling back to a robust | ||
| recursive implementation. Never throws — works in React Native (Hermes) and all JS runtimes. | ||
| `deepClone` uses the native `structuredClone` API when available and falls back to a recursive | ||
| implementation when it is not. It never throws, and it works in React Native (Hermes) and other JS runtimes. | ||
@@ -699,3 +713,3 @@ ```typescript | ||
| Type-safe JSON parsing and validation that returns `Result<T>` — no exceptions, fits directly into the railway pipeline. | ||
| Type-safe JSON parsing and validation that returns `Result<T>` instead of throwing, so it fits directly into the railway pipeline. | ||
@@ -767,4 +781,5 @@ ```typescript | ||
| ```typescript | ||
| import { pipe, flow } from 'tsentials/function'; | ||
| import { pipe, flow, identity, constant, flip } from 'tsentials/function'; | ||
| // pipe — thread a value through unary functions (up to 15 steps, fully typed) | ||
| const result = pipe( | ||
@@ -777,2 +792,3 @@ 5, | ||
| // flow — compose functions into a reusable pipeline | ||
| const doubleAndStringify = flow( | ||
@@ -783,2 +799,8 @@ (n: number) => n * 2, | ||
| doubleAndStringify(5); // "10" | ||
| identity(42); // 42 | ||
| const alwaysTrue = constant(true); | ||
| alwaysTrue(); // true | ||
| const subtract = (a: number, b: number) => a - b; | ||
| flip(subtract)(3, 10); // 7 — arguments reversed | ||
| ``` | ||
@@ -788,10 +810,12 @@ | ||
| Type-safe arrays guaranteed to have at least one element. No null checks needed for `head()` or `last()`. | ||
| Type-safe arrays guaranteed to have at least one element, so `head()` and `last()` never need a null check. | ||
| ```typescript | ||
| import { NonEmptyArray, asNonEmptyArray } from 'tsentials/array'; | ||
| import { NonEmptyArray, asNonEmptyArray, isNonEmpty, prepend, append, head, tail, last, init } from 'tsentials/array'; | ||
| const items: NonEmptyArray<string> = ['a', 'b', 'c']; | ||
| NonEmptyArray.head(items); // 'a' — safe, no Maybe | ||
| NonEmptyArray.last(items); // 'c' | ||
| head(items); // 'a' — safe, no Maybe | ||
| last(items); // 'c' | ||
| tail(items); // ['b', 'c'] — plain array | ||
| init(items); // ['a', 'b'] — plain array | ||
@@ -801,2 +825,16 @@ // Safe conversion from plain array | ||
| const sure = asNonEmptyArray([1, 2]); // Some([1, 2]) | ||
| // Type guard — narrows a plain array | ||
| const values = [1, 2, 3]; | ||
| if (isNonEmpty(values)) { | ||
| head(values); // 1 — no null check needed inside the guard | ||
| } | ||
| // Construction that preserves the guarantee | ||
| prepend(0, [1, 2]); // NonEmptyArray [0, 1, 2] | ||
| append([1, 2], 3); // NonEmptyArray [1, 2, 3] | ||
| // map/reverse/sort keep the non-empty guarantee; filter returns a plain array | ||
| NonEmptyArray.map(items, s => s.toUpperCase()); // NonEmptyArray ['A', 'B', 'C'] | ||
| NonEmptyArray.filter(items, s => s !== 'a'); // ['b', 'c'] — may become empty | ||
| ``` | ||
@@ -806,17 +844,35 @@ | ||
| Composable, type-safe equality and ordering. | ||
| Composable, type-safe equality and ordering. `Eq<A>` provides `equals`, `Ord<A>` extends it with `compare` returning `-1 | 0 | 1`. | ||
| ```typescript | ||
| import { Eq, Ord } from 'tsentials/eq'; | ||
| import { sortBy, min, max, clamp } from 'tsentials/ord'; | ||
| import { Eq } from 'tsentials/eq'; | ||
| import { Ord, sortBy, min, max, clamp, between, reverse } from 'tsentials/ord'; | ||
| interface User { readonly id: number; readonly name: string; } | ||
| interface User { readonly id: number; readonly name: string; readonly age: number; } | ||
| const eqUser = Eq.struct<User>({ id: Eq.number, name: Eq.string }); | ||
| // Structural equality from primitive instances (Eq.strict/string/number/boolean/date) | ||
| const eqUser = Eq.struct<User>({ id: Eq.number, name: Eq.string, age: Eq.number }); | ||
| eqUser.equals({ id: 1, name: 'A', age: 30 }, { id: 1, name: 'A', age: 30 }); // true | ||
| // Compare by projection | ||
| const eqById = Eq.contramap(Eq.number, (u: User) => u.id); | ||
| const eqNumberArray = Eq.getArrayEq(Eq.number); // element-wise array equality | ||
| const users: User[] = [ | ||
| { id: 1, name: 'Carol', age: 35 }, | ||
| { id: 2, name: 'Alice', age: 30 }, | ||
| ]; | ||
| const byAge = Ord.contramap(Ord.number, (u: User) => u.age); | ||
| const sorted = sortBy(users, byAge); | ||
| sortBy(users, byAge); // sorted copy, ascending | ||
| sortBy(users, reverse(byAge)); // descending | ||
| min(byAge, userA, userB); | ||
| clamp(Ord.number, 0, 100, 150); // 100 | ||
| const [a, b] = [users[0]!, users[1]!]; | ||
| min(byAge, a, b); // Alice (30) | ||
| max(byAge, a, b); // Carol (35) | ||
| clamp(Ord.number, 0, 100, 150); // 100 | ||
| between(Ord.number, 0, 100, 42); // true | ||
| // Multi-field ordering — compares fields in order, short-circuits | ||
| const byNameThenAge = Ord.struct({ name: Ord.string, age: Ord.number }); | ||
| ``` | ||
@@ -831,7 +887,20 @@ | ||
| interface User { readonly age: number; readonly isActive: boolean; readonly role: string; } | ||
| const isAdult = Predicate.from((u: User) => u.age >= 18); | ||
| const isActive = Predicate.from((u: User) => u.isActive); | ||
| const isAdmin = Predicate.from((u: User) => u.role === 'admin'); | ||
| const isValid = Predicate.and(isAdult, isActive); | ||
| const isAnyOf = Predicate.any(isAdult, isGuest, isAdmin); | ||
| isValid.test({ age: 20, isActive: true, role: 'user' }); // true | ||
| Predicate.or(isAdult, isAdmin); // either passes | ||
| Predicate.not(isAdult); // negation | ||
| Predicate.all(isAdult, isActive, isAdmin); // every predicate must pass | ||
| Predicate.any(isAdult, isActive, isAdmin); // at least one must pass | ||
| // Refinement — narrows the type on success | ||
| const isString = Predicate.refinement((v: unknown): v is string => typeof v === 'string'); | ||
| const input: unknown = 'hello'; | ||
| if (isString.test(input)) input.toUpperCase(); // input is string here | ||
| ``` | ||
@@ -841,15 +910,34 @@ | ||
| Partial success — a value together with errors/warnings. Unlike `Result<T>` which is either-or, `These` allows both. | ||
| Partial success: a value together with errors or warnings. `Result<T>` is either-or; `These` allows both at once. Use `These<AppError[], A>` when you want the `Result` bridge, since `toResult` expects the error side to be an array. | ||
| ```typescript | ||
| import { These } from 'tsentials/these'; | ||
| import { Err, type AppError } from 'tsentials/errors'; | ||
| const parseAge = (raw: string): These<AppError, number> => { | ||
| const parseAge = (raw: string): These<AppError[], number> => { | ||
| const age = Number(raw); | ||
| if (Number.isNaN(age)) return These.left(Err.validation('Age.NaN', 'Not a number')); | ||
| if (age < 0) return These.both(Err.validation('Age.Negative', 'Negative age'), 0); | ||
| if (Number.isNaN(age)) return These.left([Err.validation('Age.NaN', 'Not a number')]); | ||
| if (age < 0) return These.both([Err.validation('Age.Negative', 'Clamped to 0')], 0); | ||
| return These.right(age); | ||
| }; | ||
| These.toResult(parseAge('-5')); // failure (Both converts to failure) | ||
| // Exhaustive match — Left, Right, and Both each get a handler | ||
| const label = These.match( | ||
| parseAge('-5'), | ||
| (errors) => `failed: ${errors[0]?.code}`, | ||
| (age) => `ok: ${age}`, | ||
| (errors, age) => `partial: ${age} with ${errors.length} warning(s)`, | ||
| ); // "partial: 0 with 1 warning(s)" | ||
| // Type guards narrow | ||
| const t = parseAge('30'); | ||
| if (These.isRight(t)) console.log(t.right); // 30 | ||
| // Bridge to Result | ||
| These.toResult(parseAge('-5')); // failure — Both converts to failure (errors win) | ||
| These.toResultLenient(parseAge('-5')); // success(0) — Both keeps the value, discards errors | ||
| // Split a batch into successes / failures / partials | ||
| const { lefts, rights, boths } = These.partition([parseAge('30'), parseAge('abc'), parseAge('-5')]); | ||
| // rights: [30], lefts: [[Age.NaN]], boths: [{ error: [...], value: 0 }] | ||
| ``` | ||
@@ -862,12 +950,27 @@ | ||
| ```typescript | ||
| import { Tree } from 'tsentials/tree'; | ||
| import { Tree, drawTree } from 'tsentials/tree'; | ||
| const tree = Tree.of('root', [ | ||
| Tree.of('a', [Tree.leaf('a1')]), | ||
| Tree.leaf('b'), | ||
| const tree = Tree.of('Electronics', [ | ||
| Tree.of('Phones', [Tree.leaf('iPhone'), Tree.leaf('Android')]), | ||
| Tree.leaf('Laptops'), | ||
| ]); | ||
| Tree.toArray(tree); // ['root', 'a', 'a1', 'b'] | ||
| Tree.find(tree, v => v === 'a1'); | ||
| Tree.drawTree(tree); | ||
| Tree.toArray(tree); // ['Electronics', 'Phones', 'iPhone', 'Android', 'Laptops'] (pre-order) | ||
| Tree.size(tree); // 5 | ||
| Tree.map(tree, s => s.toUpperCase()); // same structure, transformed values | ||
| Tree.find(tree, v => v === 'iPhone'); // first matching node (depth-first) | null | ||
| Tree.findAll(tree, v => v.length > 6); // all matching nodes | ||
| Tree.filter(tree, v => v === 'Phones'); // parent kept if any descendant matches | ||
| // Post-order fold — e.g. count all nodes | ||
| Tree.fold(tree, (_value, children: readonly number[]) => | ||
| 1 + children.reduce((a, b) => a + b, 0), | ||
| ); // 5 | ||
| console.log(drawTree(tree)); | ||
| // Electronics | ||
| // ├── Phones | ||
| // │ ├── iPhone | ||
| // │ └── Android | ||
| // └── Laptops | ||
| ``` | ||
@@ -884,6 +987,20 @@ | ||
| R.map(users, u => u.name); // { a: 'Alice', b: 'Bob' } | ||
| R.filter(users, u => u.name !== 'Bob'); | ||
| R.pick(users, 'a'); // { a: { name: 'Alice' } } | ||
| R.omit(users, 'b'); // { a: { name: 'Alice' } } | ||
| R.map(users, u => u.name); // { a: 'Alice', b: 'Bob' } | ||
| R.filter(users, u => u.name !== 'Bob'); // { a: { name: 'Alice' } } | ||
| R.pick(users, 'a'); // { a: { name: 'Alice' } } | ||
| R.omit(users, 'b'); // { a: { name: 'Alice' } } | ||
| R.keys(users); // ['a', 'b'] — typed | ||
| R.size(users); // 2 | ||
| R.has(users, 'a'); // true | ||
| const scores = { math: 90, art: 40, science: 75 }; | ||
| R.reduce(scores, 0, (acc, v) => acc + v); // 205 | ||
| R.partition(scores, v => v >= 60); // { pass: { math, science }, fail: { art } } | ||
| R.filterMap(scores, v => (v >= 60 ? v + 10 : null)); // { math: 100, science: 85 } | ||
| R.mapWithKey(scores, (k, v) => [k.toUpperCase(), v]); // { MATH: 90, ART: 40, SCIENCE: 75 } | ||
| // upsert/remove — immutable; the key must belong to the record's key union | ||
| R.upsert(scores, 'art', 55); // { math: 90, art: 55, science: 75 } | ||
| R.remove(scores, 'art'); // { math: 90, science: 75 } | ||
| ``` | ||
@@ -890,0 +1007,0 @@ |
261233
2.46%3275
0.74%1023
12.91%