functype 0.8.60 → 0.8.62
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.
- package/README.md +35 -3
- package/dist/Map-BNxKlujn.mjs +46 -0
- package/dist/Map-BNxKlujn.mjs.map +1 -0
- package/dist/branded/Brand.d.ts +46 -0
- package/dist/branded/index.d.ts +1 -0
- package/dist/branded/index.mjs +23 -0
- package/dist/branded/index.mjs.map +1 -0
- package/dist/collections/index.d.ts +8 -0
- package/dist/companion/Companion.d.ts +23 -0
- package/dist/companion/index.d.ts +1 -0
- package/dist/core/base/Base.d.ts +10 -0
- package/dist/core/base/index.d.ts +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/info/Info.d.ts +26 -0
- package/dist/core/info/index.d.ts +1 -0
- package/dist/core/task/Task.d.ts +57 -0
- package/dist/core/task/index.d.ts +1 -0
- package/dist/core/throwable/Throwable.d.ts +18 -0
- package/dist/core/throwable/index.d.ts +1 -0
- package/dist/either/Either.d.ts +57 -0
- package/dist/either/index.d.ts +1 -0
- package/dist/either/index.mjs +13 -0
- package/dist/either/index.mjs.map +1 -0
- package/dist/error/ParseError.d.ts +6 -0
- package/dist/error/index.d.ts +1 -0
- package/dist/fpromise/FPromise.d.ts +369 -0
- package/dist/fpromise/index.d.ts +2 -0
- package/dist/fpromise/index.mjs +6 -0
- package/dist/fpromise/index.mjs.map +1 -0
- package/dist/fpromise/retry.d.ts +106 -0
- package/dist/functor/index.d.ts +18 -0
- package/dist/hkt/index.d.ts +49 -0
- package/dist/identity/Identity.d.ts +5 -0
- package/dist/identity/index.d.ts +1 -0
- package/dist/index-CgMYHgdG.mjs +1286 -0
- package/dist/index-CgMYHgdG.mjs.map +1 -0
- package/dist/index.d.ts +20 -842
- package/dist/index.mjs +174 -2
- package/dist/index.mjs.map +1 -1
- package/dist/iterable/index.d.ts +25 -0
- package/dist/list/List.d.ts +45 -0
- package/dist/list/index.d.ts +1 -0
- package/dist/list/index.mjs +5 -0
- package/dist/list/index.mjs.map +1 -0
- package/dist/map/Map.d.ts +19 -0
- package/dist/map/index.d.ts +2 -0
- package/dist/map/index.mjs +7 -0
- package/dist/map/index.mjs.map +1 -0
- package/dist/map/shim.d.ts +2 -0
- package/dist/option/Option.d.ts +164 -0
- package/dist/option/index.d.ts +1 -0
- package/dist/option/index.mjs +7 -0
- package/dist/option/index.mjs.map +1 -0
- package/dist/serializable/Serializable.d.ts +15 -0
- package/dist/serializable/index.d.ts +1 -0
- package/dist/set/Set.d.ts +16 -0
- package/dist/set/index.d.ts +2 -0
- package/dist/set/index.mjs +5 -0
- package/dist/set/index.mjs.map +1 -0
- package/dist/set/shim.d.ts +2 -0
- package/dist/try/Try.d.ts +20 -0
- package/dist/try/index.d.ts +1 -0
- package/dist/try/index.mjs +44 -0
- package/dist/try/index.mjs.map +1 -0
- package/dist/tuple/Tuple.d.ts +11 -0
- package/dist/tuple/index.d.ts +1 -0
- package/dist/tuple/index.mjs +27 -0
- package/dist/tuple/index.mjs.map +1 -0
- package/dist/typeable/Typeable.d.ts +10 -0
- package/dist/typeable/index.d.ts +1 -0
- package/dist/util/index.d.ts +3 -0
- package/dist/util/isIterable.d.ts +1 -0
- package/dist/valuable/Valuable.d.ts +13 -0
- package/dist/valuable/index.d.ts +1 -0
- package/package.json +84 -21
package/README.md
CHANGED
|
@@ -43,6 +43,8 @@ Functype is a lightweight functional programming library for TypeScript, drawing
|
|
|
43
43
|
- [ ] Implement immutable data structures with structural sharing
|
|
44
44
|
- [ ] Add performance benchmarks
|
|
45
45
|
- [x] Optimize TreeShaking with sideEffects flag in package.json
|
|
46
|
+
- [x] Support selective module imports for smaller bundles
|
|
47
|
+
- [x] Add bundle size monitoring to CI/CD
|
|
46
48
|
|
|
47
49
|
### API Consistency
|
|
48
50
|
|
|
@@ -50,9 +52,9 @@ Functype is a lightweight functional programming library for TypeScript, drawing
|
|
|
50
52
|
- Constructor functions that return objects with methods
|
|
51
53
|
- Object methods for common operations
|
|
52
54
|
- Companion functions for additional utilities
|
|
53
|
-
- [
|
|
55
|
+
- [x] Align Task API with other monadic structures
|
|
54
56
|
- [ ] Standardize import patterns (@ imports vs relative paths)
|
|
55
|
-
- [
|
|
57
|
+
- [x] Implement consistent error handling strategy for async operations
|
|
56
58
|
|
|
57
59
|
### Testing and Documentation
|
|
58
60
|
|
|
@@ -88,6 +90,21 @@ pnpm add functype
|
|
|
88
90
|
bun add functype
|
|
89
91
|
```
|
|
90
92
|
|
|
93
|
+
### Bundle Size Optimization
|
|
94
|
+
|
|
95
|
+
Functype is optimized for tree-shaking and offers multiple import strategies to minimize bundle size:
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// Selective module imports (recommended for production)
|
|
99
|
+
import { Option } from "functype/option"
|
|
100
|
+
import { Either } from "functype/either"
|
|
101
|
+
|
|
102
|
+
// Direct constructor imports (smallest bundle)
|
|
103
|
+
import { some, none } from "functype/option"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
For detailed optimization strategies, see the [Bundle Optimization Guide](docs/BUNDLE_OPTIMIZATION.md).
|
|
107
|
+
|
|
91
108
|
## Usage Examples
|
|
92
109
|
|
|
93
110
|
### Option
|
|
@@ -189,7 +206,7 @@ const either = result.toEither()
|
|
|
189
206
|
import { Task } from "functype"
|
|
190
207
|
|
|
191
208
|
// Synchronous operations with error handling
|
|
192
|
-
const syncResult = Task().
|
|
209
|
+
const syncResult = Task().Sync(
|
|
193
210
|
() => "success",
|
|
194
211
|
(error) => new Error(`Failed: ${error}`),
|
|
195
212
|
)
|
|
@@ -202,6 +219,21 @@ const asyncTask = async () => {
|
|
|
202
219
|
)
|
|
203
220
|
return result
|
|
204
221
|
}
|
|
222
|
+
|
|
223
|
+
// Converting promise-based functions to Task
|
|
224
|
+
const fetchUserAPI = (userId: string): Promise<User> => fetch(`/api/users/${userId}`).then((r) => r.json())
|
|
225
|
+
|
|
226
|
+
// Use the adapter pattern for seamless integration
|
|
227
|
+
const fetchUser = Task({ name: "UserFetch" }).fromPromise(fetchUserAPI)
|
|
228
|
+
|
|
229
|
+
// Later use it with standard promise patterns
|
|
230
|
+
fetchUser("user123")
|
|
231
|
+
.then((user) => console.log(user))
|
|
232
|
+
.catch((error) => console.error(error))
|
|
233
|
+
|
|
234
|
+
// Or convert Task results back to promises
|
|
235
|
+
const taskResult = Task().Sync(() => "hello world")
|
|
236
|
+
const promise = Task().toPromise(taskResult) // Promise<string>
|
|
205
237
|
```
|
|
206
238
|
|
|
207
239
|
## Type Safety
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { f as h, e as n, O as c } from "./index-CgMYHgdG.mjs";
|
|
2
|
+
import { Tuple as w } from "./tuple/index.mjs";
|
|
3
|
+
const l = Map, r = (a) => {
|
|
4
|
+
const i = "Map", s = {
|
|
5
|
+
values: new l(a)
|
|
6
|
+
}, o = () => Array.from(s.values.entries()).map(([t, e]) => w([t, e])), u = (t) => r(new l(s.values).set(t.toArray()[0], t.toArray()[1]).entries()), p = (t) => {
|
|
7
|
+
const e = new l(s.values);
|
|
8
|
+
return e.delete(t) ? r(e.entries()) : r(s.values.entries());
|
|
9
|
+
}, g = (t) => {
|
|
10
|
+
const e = t.toArray();
|
|
11
|
+
return s.values.get(e[0]) === e[1];
|
|
12
|
+
}, v = () => s.values.size, f = (t) => r(Array.from(s.values.entries()).map(([e, O]) => [e, t(O)])), d = (t) => {
|
|
13
|
+
const e = r(s.values.entries()).toList();
|
|
14
|
+
return r(e.flatMap(t).toArray());
|
|
15
|
+
}, m = (t) => n(o()).reduce(t), M = (t) => n(o()).reduceRight(t), E = (t) => (e) => n(o()).foldLeft(t)(e), y = (t) => (e) => n(o()).foldRight(t)(e), S = (t) => c(s.values.get(t)), A = (t, e) => c(s.values.get(t)).getOrElse(e), L = () => s.values.size === 0;
|
|
16
|
+
return {
|
|
17
|
+
_tag: i,
|
|
18
|
+
add: u,
|
|
19
|
+
remove: p,
|
|
20
|
+
contains: g,
|
|
21
|
+
get size() {
|
|
22
|
+
return v();
|
|
23
|
+
},
|
|
24
|
+
map: f,
|
|
25
|
+
flatMap: d,
|
|
26
|
+
reduce: m,
|
|
27
|
+
reduceRight: M,
|
|
28
|
+
foldLeft: E,
|
|
29
|
+
foldRight: y,
|
|
30
|
+
get: S,
|
|
31
|
+
getOrElse: A,
|
|
32
|
+
get isEmpty() {
|
|
33
|
+
return L();
|
|
34
|
+
},
|
|
35
|
+
orElse: (t, e) => c(s.values.get(t)).orElse(e),
|
|
36
|
+
toList: () => n(o()),
|
|
37
|
+
toSet: () => h(o()),
|
|
38
|
+
toString: () => `Map(${o().toString()})`,
|
|
39
|
+
toValue: () => ({ _tag: "Map", value: s.values })
|
|
40
|
+
};
|
|
41
|
+
}, x = (a) => r(a);
|
|
42
|
+
export {
|
|
43
|
+
l as E,
|
|
44
|
+
x as M
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=Map-BNxKlujn.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Map-BNxKlujn.mjs","sources":["../src/map/shim.ts","../src/map/Map.ts"],"sourcesContent":["export type IESMap<K, V> = Map<K, V>\nexport const ESMap = Map\n","import type { Collection } from \"@/collections\"\nimport { type Traversable, Typeable } from \"@/index\"\nimport type { IterableType } from \"@/iterable\"\nimport { List } from \"@/list/List\"\nimport { Option } from \"@/option/Option\"\nimport { Set } from \"@/set/Set\"\nimport { Tuple } from \"@/tuple/Tuple\"\nimport { Valuable } from \"@/valuable/Valuable\"\n\nimport { ESMap, type IESMap } from \"./shim\"\n\ntype SafeTraversable<K, V> = Omit<Traversable<Tuple<[K, V]>>, \"map\" | \"flatMap\">\n\nexport type Map<K, V> = {\n add(item: Tuple<[K, V]>): Map<K, V>\n remove(value: K): Map<K, V>\n map<U>(f: (value: V) => U): Map<K, U>\n flatMap<K2, V2>(f: (entry: Tuple<[K, V]>) => IterableType<[K2, V2]>): Map<K2, V2>\n get(key: K): Option<V>\n getOrElse(key: K, defaultValue: V): V\n orElse(key: K, alternative: Option<V>): Option<V>\n} & SafeTraversable<K, V> &\n Collection<Tuple<[K, V]>> &\n Typeable<\"Map\"> &\n Valuable<\"Map\", IESMap<K, V>>\n\ntype MapState<K, V> = {\n values: IESMap<K, V>\n}\n\nconst MapObject = <K, V>(entries?: readonly (readonly [K, V])[] | IterableIterator<[K, V]> | null): Map<K, V> => {\n const _tag = \"Map\"\n const state: MapState<K, V> = {\n values: new ESMap<K, V>(entries),\n }\n\n const getEntries = () => Array.from(state.values.entries()).map(([key, value]) => Tuple<[K, V]>([key, value]))\n\n const add = (item: Tuple<[K, V]>): Map<K, V> =>\n MapObject(new ESMap(state.values).set(item.toArray()[0], item.toArray()[1]).entries())\n\n const remove = (value: K): Map<K, V> => {\n const newMap = new ESMap(state.values)\n return newMap.delete(value) ? MapObject(newMap.entries()) : MapObject(state.values.entries())\n }\n\n const contains = (value: Tuple<[K, V]>): boolean => {\n const tuple = value.toArray()\n return state.values.get(tuple[0]) === tuple[1]\n }\n\n const size = (): number => state.values.size\n\n const map = <U>(f: (value: V) => U): Map<K, U> =>\n MapObject(Array.from(state.values.entries()).map(([k, v]) => [k, f(v)]))\n\n const flatMap = <K2, V2>(f: (entry: Tuple<[K, V]>) => IterableType<[K2, V2]>): Map<K2, V2> => {\n const list = MapObject(state.values.entries()).toList()\n return MapObject(list.flatMap(f).toArray())\n }\n\n const reduce = (f: (acc: Tuple<[K, V]>, value: Tuple<[K, V]>) => Tuple<[K, V]>): Tuple<[K, V]> =>\n List(getEntries()).reduce(f)\n\n const reduceRight = (f: (acc: Tuple<[K, V]>, value: Tuple<[K, V]>) => Tuple<[K, V]>): Tuple<[K, V]> =>\n List(getEntries()).reduceRight(f)\n\n const foldLeft =\n <B>(z: B) =>\n (op: (b: B, a: Tuple<[K, V]>) => B): B =>\n List(getEntries()).foldLeft(z)(op)\n\n const foldRight =\n <B>(z: B) =>\n (op: (a: Tuple<[K, V]>, b: B) => B): B =>\n List(getEntries()).foldRight(z)(op)\n\n const get = (key: K): Option<V> => Option(state.values.get(key))\n\n const getOrElse = (key: K, defaultValue: V): V => Option(state.values.get(key)).getOrElse(defaultValue)\n\n const isEmpty = (): boolean => state.values.size === 0\n\n const orElse = (key: K, alternative: Option<V>): Option<V> => Option(state.values.get(key)).orElse(alternative)\n\n const toList = (): List<Tuple<[K, V]>> => List(getEntries())\n\n const toSet = (): Set<Tuple<[K, V]>> => Set(getEntries())\n\n const toString = (): string => `Map(${getEntries().toString()})`\n\n return {\n _tag,\n add,\n remove,\n contains,\n get size() {\n return size()\n },\n map,\n flatMap,\n reduce,\n reduceRight,\n foldLeft,\n foldRight,\n get,\n getOrElse,\n get isEmpty() {\n return isEmpty()\n },\n orElse,\n toList,\n toSet,\n toString,\n toValue: () => ({ _tag: \"Map\", value: state.values }),\n }\n}\n\nexport const Map = <K, V>(entries?: readonly (readonly [K, V])[] | IterableIterator<[K, V]> | null): Map<K, V> =>\n MapObject(entries)\n\n// Example usage\n// const myMap = createMap<string, unknown>([\n// [\"a\", 1],\n// [\"b\", 2],\n// [\"c\", 3],\n// ])\n"],"names":["ESMap","MapObject","entries","_tag","state","getEntries","key","value","Tuple","add","item","remove","newMap","contains","tuple","size","map","f","k","v","flatMap","list","reduce","List","reduceRight","foldLeft","z","op","foldRight","get","Option","getOrElse","defaultValue","isEmpty","alternative","Set","Map"],"mappings":";;AACO,MAAMA,IAAQ,KC6BfC,IAAY,CAAOC,MAAwF;AAC/G,QAAMC,IAAO,OACPC,IAAwB;AAAA,IAC5B,QAAQ,IAAIJ,EAAYE,CAAO;AAAA,EACjC,GAEMG,IAAa,MAAM,MAAM,KAAKD,EAAM,OAAO,SAAS,EAAE,IAAI,CAAC,CAACE,GAAKC,CAAK,MAAMC,EAAc,CAACF,GAAKC,CAAK,CAAC,CAAC,GAEvGE,IAAM,CAACC,MACXT,EAAU,IAAID,EAAMI,EAAM,MAAM,EAAE,IAAIM,EAAK,QAAU,EAAA,CAAC,GAAGA,EAAK,QAAA,EAAU,CAAC,CAAC,EAAE,SAAS,GAEjFC,IAAS,CAACJ,MAAwB;AACtC,UAAMK,IAAS,IAAIZ,EAAMI,EAAM,MAAM;AACrC,WAAOQ,EAAO,OAAOL,CAAK,IAAIN,EAAUW,EAAO,QAAS,CAAA,IAAIX,EAAUG,EAAM,OAAO,SAAS;AAAA,EAC9F,GAEMS,IAAW,CAACN,MAAkC;AAC5C,UAAAO,IAAQP,EAAM,QAAQ;AACrB,WAAAH,EAAM,OAAO,IAAIU,EAAM,CAAC,CAAC,MAAMA,EAAM,CAAC;AAAA,EAC/C,GAEMC,IAAO,MAAcX,EAAM,OAAO,MAElCY,IAAM,CAAIC,MACdhB,EAAU,MAAM,KAAKG,EAAM,OAAO,QAAS,CAAA,EAAE,IAAI,CAAC,CAACc,GAAGC,CAAC,MAAM,CAACD,GAAGD,EAAEE,CAAC,CAAC,CAAC,CAAC,GAEnEC,IAAU,CAASH,MAAqE;AAC5F,UAAMI,IAAOpB,EAAUG,EAAM,OAAO,QAAQ,CAAC,EAAE,OAAO;AACtD,WAAOH,EAAUoB,EAAK,QAAQJ,CAAC,EAAE,SAAS;AAAA,EAC5C,GAEMK,IAAS,CAACL,MACdM,EAAKlB,GAAY,EAAE,OAAOY,CAAC,GAEvBO,IAAc,CAACP,MACnBM,EAAKlB,GAAY,EAAE,YAAYY,CAAC,GAE5BQ,IACJ,CAAIC,MACJ,CAACC,MACCJ,EAAKlB,EAAW,CAAC,EAAE,SAASqB,CAAC,EAAEC,CAAE,GAE/BC,IACJ,CAAIF,MACJ,CAACC,MACCJ,EAAKlB,EAAW,CAAC,EAAE,UAAUqB,CAAC,EAAEC,CAAE,GAEhCE,IAAM,CAACvB,MAAsBwB,EAAO1B,EAAM,OAAO,IAAIE,CAAG,CAAC,GAEzDyB,IAAY,CAACzB,GAAQ0B,MAAuBF,EAAO1B,EAAM,OAAO,IAAIE,CAAG,CAAC,EAAE,UAAU0B,CAAY,GAEhGC,IAAU,MAAe7B,EAAM,OAAO,SAAS;AAU9C,SAAA;AAAA,IACL,MAAAD;AAAA,IACA,KAAAM;AAAA,IACA,QAAAE;AAAA,IACA,UAAAE;AAAA,IACA,IAAI,OAAO;AACT,aAAOE,EAAK;AAAA,IACd;AAAA,IACA,KAAAC;AAAA,IACA,SAAAI;AAAA,IACA,QAAAE;AAAA,IACA,aAAAE;AAAA,IACA,UAAAC;AAAA,IACA,WAAAG;AAAA,IACA,KAAAC;AAAA,IACA,WAAAE;AAAA,IACA,IAAI,UAAU;AACZ,aAAOE,EAAQ;AAAA,IACjB;AAAA,IACA,QA3Ba,CAAC3B,GAAQ4B,MAAsCJ,EAAO1B,EAAM,OAAO,IAAIE,CAAG,CAAC,EAAE,OAAO4B,CAAW;AAAA,IA4B5G,QA1Ba,MAA2BX,EAAKlB,GAAY;AAAA,IA2BzD,OAzBY,MAA0B8B,EAAI9B,GAAY;AAAA,IA0BtD,UAxBe,MAAc,OAAOA,EAAW,EAAE,SAAU,CAAA;AAAA,IAyB3D,SAAS,OAAO,EAAE,MAAM,OAAO,OAAOD,EAAM,OAAO;AAAA,EACrD;AACF,GAEagC,IAAM,CAAOlC,MACxBD,EAAUC,CAAO;"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brand is a utility for creating nominal typing in TypeScript
|
|
3
|
+
* It allows for creating distinct types that are structurally identical
|
|
4
|
+
* but considered different by TypeScript's type system
|
|
5
|
+
*/
|
|
6
|
+
export type Brand<K extends string, T> = T & {
|
|
7
|
+
readonly __brand: K;
|
|
8
|
+
};
|
|
9
|
+
export type Unbrand<T> = T extends Brand<string, infer U> ? U : never;
|
|
10
|
+
export type ExtractBrand<T> = T extends Brand<infer K, unknown> ? K : never;
|
|
11
|
+
/**
|
|
12
|
+
* Helper to create a branded type
|
|
13
|
+
* @param value - The value to brand
|
|
14
|
+
* @returns The branded value
|
|
15
|
+
*/
|
|
16
|
+
export declare function Brand<K extends string, T>(brand: K, value: T): Brand<K, T>;
|
|
17
|
+
/**
|
|
18
|
+
* Helper to remove a brand from a value
|
|
19
|
+
* @param branded - The branded value
|
|
20
|
+
* @returns The original value without the brand
|
|
21
|
+
*/
|
|
22
|
+
export declare function unbrand<T>(branded: Brand<string, T>): T;
|
|
23
|
+
/**
|
|
24
|
+
* Type guard for checking if a value has a specific brand
|
|
25
|
+
* @param value - The value to check
|
|
26
|
+
* @param brand - The brand to check for
|
|
27
|
+
* @returns True if the value has the specified brand
|
|
28
|
+
*
|
|
29
|
+
* Note: Since brands are phantom types that exist only at compile time,
|
|
30
|
+
* this function can only provide a runtime approximation. It always returns true
|
|
31
|
+
* for non-null values, as we have no way to actually check the brand at runtime.
|
|
32
|
+
* This function is primarily for API consistency and documentation purposes.
|
|
33
|
+
*/
|
|
34
|
+
export declare function hasBrand<K extends string, T>(value: unknown, brand: K): value is Brand<K, T>;
|
|
35
|
+
/**
|
|
36
|
+
* Create a branded type constructor for a specific brand
|
|
37
|
+
* @param brand - The brand name
|
|
38
|
+
* @returns A function that brands values with the specified brand
|
|
39
|
+
*/
|
|
40
|
+
export declare function createBrander<K extends string, T>(brand: K): (value: T) => Brand<K, T>;
|
|
41
|
+
export type BrandedString<K extends string> = Brand<K, string>;
|
|
42
|
+
export type BrandedNumber<K extends string> = Brand<K, number>;
|
|
43
|
+
export type BrandedBoolean<K extends string> = Brand<K, boolean>;
|
|
44
|
+
export declare const BrandedString: <K extends string>(brand: K) => (value: string) => BrandedString<K>;
|
|
45
|
+
export declare const BrandedNumber: <K extends string>(brand: K) => (value: number) => BrandedNumber<K>;
|
|
46
|
+
export declare const BrandedBoolean: <K extends string>(brand: K) => (value: boolean) => BrandedBoolean<K>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Brand';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
function t(n, r) {
|
|
2
|
+
return r;
|
|
3
|
+
}
|
|
4
|
+
function d(n) {
|
|
5
|
+
return n;
|
|
6
|
+
}
|
|
7
|
+
function e(n, r) {
|
|
8
|
+
return n != null;
|
|
9
|
+
}
|
|
10
|
+
function a(n) {
|
|
11
|
+
return (r) => t(n, r);
|
|
12
|
+
}
|
|
13
|
+
const o = (n) => (r) => t(n, r), u = (n) => (r) => t(n, r), c = (n) => (r) => t(n, r);
|
|
14
|
+
export {
|
|
15
|
+
t as Brand,
|
|
16
|
+
c as BrandedBoolean,
|
|
17
|
+
u as BrandedNumber,
|
|
18
|
+
o as BrandedString,
|
|
19
|
+
a as createBrander,
|
|
20
|
+
e as hasBrand,
|
|
21
|
+
d as unbrand
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/branded/Brand.ts"],"sourcesContent":["/**\n * Brand is a utility for creating nominal typing in TypeScript\n * It allows for creating distinct types that are structurally identical\n * but considered different by TypeScript's type system\n */\n\n// The brand symbol type\nexport type Brand<K extends string, T> = T & { readonly __brand: K }\n\n// Utility type to extract the underlying type from a branded type\nexport type Unbrand<T> = T extends Brand<string, infer U> ? U : never\n\n// Utility type to extract the brand from a branded type\nexport type ExtractBrand<T> = T extends Brand<infer K, unknown> ? K : never\n\n/**\n * Helper to create a branded type\n * @param value - The value to brand\n * @returns The branded value\n */\nexport function Brand<K extends string, T>(brand: K, value: T): Brand<K, T> {\n return value as Brand<K, T>\n}\n\n/**\n * Helper to remove a brand from a value\n * @param branded - The branded value\n * @returns The original value without the brand\n */\nexport function unbrand<T>(branded: Brand<string, T>): T {\n return branded as T\n}\n\n/**\n * Type guard for checking if a value has a specific brand\n * @param value - The value to check\n * @param brand - The brand to check for\n * @returns True if the value has the specified brand\n *\n * Note: Since brands are phantom types that exist only at compile time,\n * this function can only provide a runtime approximation. It always returns true\n * for non-null values, as we have no way to actually check the brand at runtime.\n * This function is primarily for API consistency and documentation purposes.\n */\nexport function hasBrand<K extends string, T>(value: unknown, brand: K): value is Brand<K, T> {\n // In a phantom type system, we can't actually check the brand at runtime\n // We can only verify the value exists\n return value !== null && value !== undefined\n}\n\n/**\n * Create a branded type constructor for a specific brand\n * @param brand - The brand name\n * @returns A function that brands values with the specified brand\n */\nexport function createBrander<K extends string, T>(brand: K) {\n return (value: T): Brand<K, T> => Brand(brand, value)\n}\n\n// Common branded primitive types\nexport type BrandedString<K extends string> = Brand<K, string>\nexport type BrandedNumber<K extends string> = Brand<K, number>\nexport type BrandedBoolean<K extends string> = Brand<K, boolean>\n\n// Factory for common primitive branded types\nexport const BrandedString =\n <K extends string>(brand: K) =>\n (value: string): BrandedString<K> =>\n Brand(brand, value)\n\nexport const BrandedNumber =\n <K extends string>(brand: K) =>\n (value: number): BrandedNumber<K> =>\n Brand(brand, value)\n\nexport const BrandedBoolean =\n <K extends string>(brand: K) =>\n (value: boolean): BrandedBoolean<K> =>\n Brand(brand, value)\n"],"names":["Brand","brand","value","unbrand","branded","hasBrand","createBrander","BrandedString","BrandedNumber","BrandedBoolean"],"mappings":"AAoBgB,SAAAA,EAA2BC,GAAUC,GAAuB;AACnE,SAAAA;AACT;AAOO,SAASC,EAAWC,GAA8B;AAChD,SAAAA;AACT;AAagB,SAAAC,EAA8BH,GAAgBD,GAAgC;AAGrF,SAAAC,KAAU;AACnB;AAOO,SAASI,EAAmCL,GAAU;AAC3D,SAAO,CAACC,MAA0BF,EAAMC,GAAOC,CAAK;AACtD;AAQO,MAAMK,IACX,CAAmBN,MACnB,CAACC,MACCF,EAAMC,GAAOC,CAAK,GAETM,IACX,CAAmBP,MACnB,CAACC,MACCF,EAAMC,GAAOC,CAAK,GAETO,IACX,CAAmBR,MACnB,CAACC,MACCF,EAAMC,GAAOC,CAAK;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a function-object hybrid similar to Scala's companion objects.
|
|
3
|
+
* This utility allows creating TypeScript function objects with attached methods,
|
|
4
|
+
* mimicking Scala's class + companion object pattern without using classes.
|
|
5
|
+
*
|
|
6
|
+
* @param object The main function that will be invoked when the object is called
|
|
7
|
+
* @param companion Additional static methods to attach to the function
|
|
8
|
+
* @returns A function with the attached methods
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const greet = (name: string) => `Hello, ${name}!`;
|
|
12
|
+
* const methods = {
|
|
13
|
+
* formal: (name: string) => `Good day, ${name}.`,
|
|
14
|
+
* casual: (name: string) => `Hey ${name}!`
|
|
15
|
+
* };
|
|
16
|
+
* const Greeter = createCompanionObject(greet, methods);
|
|
17
|
+
*
|
|
18
|
+
* // Usage:
|
|
19
|
+
* Greeter("World"); // Hello, World!
|
|
20
|
+
* Greeter.formal("Sir"); // Good day, Sir.
|
|
21
|
+
* Greeter.casual("Friend"); // Hey Friend!
|
|
22
|
+
*/
|
|
23
|
+
export declare function Companion<ObjectF extends object, CompanionF extends object>(object: ObjectF, companion: CompanionF): ObjectF & CompanionF;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Companion';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Base';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Identity } from '../../identity/Identity';
|
|
2
|
+
type Params = {
|
|
3
|
+
id: string;
|
|
4
|
+
description: string;
|
|
5
|
+
location: string;
|
|
6
|
+
reason: string;
|
|
7
|
+
means: string;
|
|
8
|
+
} & Identity<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Base Object from which most other objects inherit
|
|
11
|
+
* @param type
|
|
12
|
+
* @param body
|
|
13
|
+
* @param params
|
|
14
|
+
* @constructor
|
|
15
|
+
*/
|
|
16
|
+
export declare function Info<T>(type: string, body: T, params: Params): T & {
|
|
17
|
+
toString(): string;
|
|
18
|
+
_tag: string;
|
|
19
|
+
} & {
|
|
20
|
+
id: string;
|
|
21
|
+
description: string;
|
|
22
|
+
location: string;
|
|
23
|
+
reason: string;
|
|
24
|
+
means: string;
|
|
25
|
+
} & Identity<string>;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Info';
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Throwable } from '../throwable/Throwable';
|
|
2
|
+
import { Either } from '../../either/Either';
|
|
3
|
+
import { FPromise } from '../../fpromise/FPromise';
|
|
4
|
+
export type TaskParams = {
|
|
5
|
+
name?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
};
|
|
8
|
+
export type TaskInfo = {
|
|
9
|
+
_task: TaskParams;
|
|
10
|
+
};
|
|
11
|
+
export type TaskException<T> = Either<Throwable, T> & TaskInfo;
|
|
12
|
+
/**
|
|
13
|
+
* TaskException factory function
|
|
14
|
+
* @param error
|
|
15
|
+
* @param _task
|
|
16
|
+
* @param data
|
|
17
|
+
* @constructor
|
|
18
|
+
*/
|
|
19
|
+
export declare const TaskException: <T>(error: unknown, data?: unknown, _task?: TaskParams) => TaskException<T>;
|
|
20
|
+
export type TaskResult<T> = Either<Throwable, T> & TaskInfo;
|
|
21
|
+
export declare const TaskResult: <T>(data: T, _task?: TaskParams) => TaskResult<T>;
|
|
22
|
+
export type Sync<T> = Either<Throwable, T>;
|
|
23
|
+
export type Async<T> = FPromise<Sync<T>>;
|
|
24
|
+
/**
|
|
25
|
+
* Task adapter for bridging promise-based code with functional error handling patterns
|
|
26
|
+
*/
|
|
27
|
+
export declare const Task: <T = unknown>(params?: TaskParams) => {
|
|
28
|
+
_type: string;
|
|
29
|
+
/**
|
|
30
|
+
* Run an async operation with explicit try/catch/finally semantics
|
|
31
|
+
* Returns a raw Promise that can interact with traditional Promise-based code
|
|
32
|
+
*/
|
|
33
|
+
Async: <U = T>(t: () => U | Promise<U>, e?: (error: unknown) => unknown, f?: () => Promise<void> | void) => FPromise<U>;
|
|
34
|
+
/**
|
|
35
|
+
* Run a synchronous operation with explicit try/catch/finally semantics
|
|
36
|
+
* Returns an Either for functional error handling
|
|
37
|
+
*/
|
|
38
|
+
Sync: <U = T>(t: () => U, e?: (error: unknown) => unknown, f?: () => void) => Sync<U>;
|
|
39
|
+
/**
|
|
40
|
+
* Create a successful Task result
|
|
41
|
+
*/
|
|
42
|
+
success: (data: T) => TaskResult<T>;
|
|
43
|
+
/**
|
|
44
|
+
* Create a failed Task result
|
|
45
|
+
*/
|
|
46
|
+
fail: (error: unknown) => TaskException<T>;
|
|
47
|
+
/**
|
|
48
|
+
* Convert a Promise-returning function to a Task-compatible function
|
|
49
|
+
*/
|
|
50
|
+
fromPromise: <U, Args extends unknown[]>(promiseFn: (...args: Args) => Promise<U>) => ((...args: Args) => FPromise<U>);
|
|
51
|
+
/**
|
|
52
|
+
* Convert a Task result to a Promise
|
|
53
|
+
*/
|
|
54
|
+
toPromise: <U>(taskResult: TaskResult<U> | TaskException<U>) => Promise<U>;
|
|
55
|
+
toString(): string;
|
|
56
|
+
_tag: string;
|
|
57
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Task';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Typeable } from '../../typeable/Typeable';
|
|
2
|
+
declare const NAME: "Throwable";
|
|
3
|
+
export type ThrowableType = Error & Typeable<typeof NAME> & {
|
|
4
|
+
readonly data?: unknown;
|
|
5
|
+
readonly cause?: Error;
|
|
6
|
+
};
|
|
7
|
+
export declare class Throwable extends Error implements ThrowableType {
|
|
8
|
+
readonly _tag: typeof NAME;
|
|
9
|
+
readonly data?: unknown;
|
|
10
|
+
readonly cause?: Error;
|
|
11
|
+
protected constructor(message: string, options?: {
|
|
12
|
+
data?: unknown | undefined;
|
|
13
|
+
cause?: Error | undefined;
|
|
14
|
+
stack?: string | undefined;
|
|
15
|
+
});
|
|
16
|
+
static apply(srcError: unknown, data?: unknown): ThrowableType;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Throwable';
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { AsyncFunctor, Functor, Type } from '../functor';
|
|
2
|
+
import { List } from '../list/List';
|
|
3
|
+
import { Option } from '../option/Option';
|
|
4
|
+
import { Typeable } from '../typeable/Typeable';
|
|
5
|
+
import { Valuable } from '../valuable/Valuable';
|
|
6
|
+
/**
|
|
7
|
+
* Either type module
|
|
8
|
+
* @module Either
|
|
9
|
+
* @category Core
|
|
10
|
+
*/
|
|
11
|
+
export type Either<L extends Type, R extends Type> = {
|
|
12
|
+
readonly _tag: "Left" | "Right";
|
|
13
|
+
value: L | R;
|
|
14
|
+
isLeft: () => boolean;
|
|
15
|
+
isRight: () => boolean;
|
|
16
|
+
getOrElse: (defaultValue: R) => R;
|
|
17
|
+
getOrThrow: () => R;
|
|
18
|
+
map: <U extends Type>(f: (value: R) => U) => Either<L, U>;
|
|
19
|
+
merge: <L1 extends Type, R1 extends Type>(other: Either<L1, R1>) => Either<L | L1, [R, R1]>;
|
|
20
|
+
mapAsync: <U extends Type>(f: (value: R) => Promise<U>) => Promise<Either<L, U>>;
|
|
21
|
+
flatMap: <U extends Type>(f: (value: R) => Either<L, U>) => Either<L, U>;
|
|
22
|
+
flatMapAsync: <U extends Type>(f: (value: R) => Promise<Either<L, U>>) => Promise<Either<L, U>>;
|
|
23
|
+
toOption: () => Option<R>;
|
|
24
|
+
toList: () => List<R>;
|
|
25
|
+
toString: () => string;
|
|
26
|
+
[Symbol.iterator]: () => Iterator<R>;
|
|
27
|
+
yield: () => Generator<R, void, unknown>;
|
|
28
|
+
traverse: <U extends Type>(f: (value: R) => Either<L, U>) => Either<L, U[]>;
|
|
29
|
+
lazyMap: <U extends Type>(f: (value: R) => U) => Generator<Either<L, U>, void, unknown>;
|
|
30
|
+
tap: (f: (value: R) => void) => Either<L, R>;
|
|
31
|
+
tapLeft: (f: (value: L) => void) => Either<L, R>;
|
|
32
|
+
mapLeft: <L2 extends Type>(f: (value: L) => L2) => Either<L2, R>;
|
|
33
|
+
bimap: <L2 extends Type, R2 extends Type>(fl: (value: L) => L2, fr: (value: R) => R2) => Either<L2, R2>;
|
|
34
|
+
fold: <T extends Type>(onLeft: (value: L) => T, onRight: (value: R) => T) => T;
|
|
35
|
+
swap: () => Either<R, L>;
|
|
36
|
+
} & Typeable<"Left" | "Right"> & Valuable<"Left" | "Right", L | R> & PromiseLike<R> & AsyncFunctor<R>;
|
|
37
|
+
export type TestEither<L extends Type, R extends Type> = Either<L, R> & Functor<R> & AsyncFunctor<R>;
|
|
38
|
+
export declare const Right: <L extends Type, R extends Type>(value: R) => Either<L, R>;
|
|
39
|
+
export declare const Left: <L extends Type, R extends Type>(value: L) => Either<L, R>;
|
|
40
|
+
export declare const isRight: <L extends Type, R extends Type>(either: Either<L, R>) => either is Either<L, R> & {
|
|
41
|
+
value: R;
|
|
42
|
+
};
|
|
43
|
+
export declare const isLeft: <L extends Type, R extends Type>(either: Either<L, R>) => either is Either<L, R> & {
|
|
44
|
+
value: L;
|
|
45
|
+
};
|
|
46
|
+
export declare const tryCatch: <L extends Type, R extends Type>(f: () => R, onError: (error: unknown) => L) => Either<L, R>;
|
|
47
|
+
export declare const TypeCheckRight: <L extends Type, R extends Type>(value: R) => TestEither<L, R>;
|
|
48
|
+
export declare const TypeCheckLeft: <L extends Type, R extends Type>(value: L) => TestEither<L, R>;
|
|
49
|
+
export declare const tryCatchAsync: <L extends Type, R extends Type>(f: () => Promise<R>, onError: (error: unknown) => L) => Promise<Either<L, R>>;
|
|
50
|
+
export declare const Either: {
|
|
51
|
+
sequence: <L extends Type, R extends Type>(eithers: Either<L, R>[]) => Either<L, R[]>;
|
|
52
|
+
traverse: <L extends Type, R extends Type, U extends Type>(arr: R[], f: (value: R) => Either<L, U>) => Either<L, U[]>;
|
|
53
|
+
fromNullable: <L extends Type, R extends Type>(value: R | null | undefined, leftValue: L) => Either<L, R>;
|
|
54
|
+
fromPredicate: <L extends Type, R extends Type>(value: R, predicate: (value: R) => boolean, leftValue: L) => Either<L, R>;
|
|
55
|
+
ap: <L extends Type, R extends Type, U extends Type>(eitherF: Either<L, (value: R) => U>, eitherV: Either<L, R>) => Either<L, U>;
|
|
56
|
+
fromPromise: <L, R>(promise: Promise<R>, onRejected: (reason: unknown) => L) => Promise<Either<L, R>>;
|
|
57
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Either';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { E as s, L as e, R as h, b as i, T as c, a as r, i as y, t as f, c as C } from "../index-CgMYHgdG.mjs";
|
|
2
|
+
export {
|
|
3
|
+
s as Either,
|
|
4
|
+
e as Left,
|
|
5
|
+
h as Right,
|
|
6
|
+
i as TypeCheckLeft,
|
|
7
|
+
c as TypeCheckRight,
|
|
8
|
+
r as isLeft,
|
|
9
|
+
y as isRight,
|
|
10
|
+
f as tryCatch,
|
|
11
|
+
C as tryCatchAsync
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ParseError';
|