functype 0.45.0 → 0.46.0
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/dist/Companion-VlxcFhzb.js +1 -0
- package/dist/{index-DBg23xHh.d.ts → Functype-Dc440LS5.d.ts} +202 -1035
- package/dist/{Tuple-35L0I92q.d.ts → Typeable-E4-aX9Gc.d.ts} +1 -74
- package/dist/Valuable-B8h0iKI_.js +13 -0
- package/dist/branded/index.d.ts +53 -1
- package/dist/branded/index.js +1 -1
- package/dist/cli/index.js +37 -7
- package/dist/do/index.d.ts +184 -2
- package/dist/do/index.js +1 -1
- package/dist/either/index.d.ts +187 -1
- package/dist/either/index.js +2 -1
- package/dist/index.d.ts +12 -4
- package/dist/index.js +1 -1
- package/dist/list/index.d.ts +84 -1
- package/dist/list/index.js +2 -1
- package/dist/map/index.d.ts +71 -1
- package/dist/map/index.js +2 -1
- package/dist/option/index.d.ts +242 -1
- package/dist/option/index.js +2 -1
- package/dist/set/index.d.ts +53 -1
- package/dist/set/index.js +2 -1
- package/dist/try/index.d.ts +96 -1
- package/dist/try/index.js +2 -1
- package/dist/tuple/index.d.ts +75 -1
- package/dist/tuple/index.js +1 -1
- package/package.json +7 -7
- package/dist/Brand-B_uQBKwR.d.ts +0 -54
- package/dist/Brand-DxglW-qB.js +0 -1
- package/dist/Tuple-BQLc_Ion.js +0 -1
- package/dist/src-Bl2PmAVK.js +0 -19
|
@@ -101,77 +101,4 @@ declare function Typeable<Tag extends string, T>({
|
|
|
101
101
|
*/
|
|
102
102
|
declare function isTypeable<T>(value: unknown, tag: string): value is T;
|
|
103
103
|
//#endregion
|
|
104
|
-
|
|
105
|
-
interface Tuple<T extends Type[]> extends Foldable<T[number]>, Pipe<Tuple<T>>, Serializable<Tuple<T>>, Typeable<"Tuple"> {
|
|
106
|
-
get<K extends number>(index: K): T[K];
|
|
107
|
-
map<U extends Type[]>(f: (value: T) => U): Tuple<U>;
|
|
108
|
-
flatMap<U extends Type[]>(f: (value: T) => Tuple<U>): Tuple<U>;
|
|
109
|
-
toArray(): T;
|
|
110
|
-
length: number;
|
|
111
|
-
[Symbol.iterator](): Iterator<T[number]>;
|
|
112
|
-
toString(): string;
|
|
113
|
-
toValue(): {
|
|
114
|
-
_tag: "Tuple";
|
|
115
|
-
value: T;
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Tuple provides a type-safe, fixed-length array with functional operations.
|
|
120
|
-
*
|
|
121
|
-
* @example
|
|
122
|
-
* // Creating tuples
|
|
123
|
-
* const t1 = Tuple([1, "hello", true])
|
|
124
|
-
* const t2 = Tuple.of(1, "hello", true)
|
|
125
|
-
* const pair = Tuple.pair("key", 42)
|
|
126
|
-
*
|
|
127
|
-
* @example
|
|
128
|
-
* // Type-safe access
|
|
129
|
-
* const triple = Tuple.triple("x", 10, true)
|
|
130
|
-
* const first = triple.get(0) // string
|
|
131
|
-
* const second = triple.get(1) // number
|
|
132
|
-
* const third = triple.get(2) // boolean
|
|
133
|
-
*
|
|
134
|
-
* @example
|
|
135
|
-
* // Functional operations
|
|
136
|
-
* const doubled = Tuple([1, 2, 3])
|
|
137
|
-
* .map(arr => arr.map(x => x * 2))
|
|
138
|
-
* .toArray() // [2, 4, 6]
|
|
139
|
-
*/
|
|
140
|
-
declare const Tuple: (<T extends Type[]>(values: T) => Tuple<T>) & {
|
|
141
|
-
/**
|
|
142
|
-
* Create a Tuple from multiple arguments
|
|
143
|
-
* @example
|
|
144
|
-
* const t = Tuple.of(1, "hello", true)
|
|
145
|
-
* // TypeScript infers: Tuple<[number, string, boolean]>
|
|
146
|
-
*/
|
|
147
|
-
of: <T extends Type[]>(...values: T) => Tuple<T>;
|
|
148
|
-
/**
|
|
149
|
-
* Create a Tuple of size 2 (pair)
|
|
150
|
-
* @example
|
|
151
|
-
* const pair = Tuple.pair("key", 42)
|
|
152
|
-
* // TypeScript infers: Tuple<[string, number]>
|
|
153
|
-
*/
|
|
154
|
-
pair: <A extends Type, B extends Type>(first: A, second: B) => Tuple<[A, B]>;
|
|
155
|
-
/**
|
|
156
|
-
* Create a Tuple of size 3 (triple)
|
|
157
|
-
* @example
|
|
158
|
-
* const triple = Tuple.triple("x", 10, true)
|
|
159
|
-
* // TypeScript infers: Tuple<[string, number, boolean]>
|
|
160
|
-
*/
|
|
161
|
-
triple: <A extends Type, B extends Type, C extends Type>(first: A, second: B, third: C) => Tuple<[A, B, C]>;
|
|
162
|
-
/**
|
|
163
|
-
* Create an empty Tuple
|
|
164
|
-
* @example
|
|
165
|
-
* const empty = Tuple.empty()
|
|
166
|
-
* // TypeScript infers: Tuple<[]>
|
|
167
|
-
*/
|
|
168
|
-
empty: () => Tuple<[]>;
|
|
169
|
-
/**
|
|
170
|
-
* Create a Tuple from an array (alias for constructor)
|
|
171
|
-
* @example
|
|
172
|
-
* const t = Tuple.from([1, 2, 3])
|
|
173
|
-
*/
|
|
174
|
-
from: <T extends Type[]>(values: T) => Tuple<T>;
|
|
175
|
-
};
|
|
176
|
-
//#endregion
|
|
177
|
-
export { isTypeable as a, Pipe as c, TypeableParams as i, Foldable as l, ExtractTag as n, Serializable as o, Typeable as r, SerializationMethods as s, Tuple as t, Type as u };
|
|
104
|
+
export { Serializable as a, Foldable as c, isTypeable as i, Type as l, Typeable as n, SerializationMethods as o, TypeableParams as r, Pipe as s, ExtractTag as t };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import{Brand as e}from"./branded/index.js";import{n as t,t as n}from"./Companion-VlxcFhzb.js";import{None as r,Option as i,Some as a}from"./option/index.js";import{Try as o}from"./try/index.js";import{List as s}from"./list/index.js";import{Left as c,Right as l}from"./either/index.js";import u from"safe-stable-stringify";const d=e=>{let t=Error(e);return t.name=`ParseError`,t},ee=(e,t)=>({toJSON:()=>JSON.stringify({_tag:e,value:t}),toYAML:()=>`_tag: ${e}\nvalue: ${u(t)}`,toBinary:()=>Buffer.from(JSON.stringify({_tag:e,value:t})).toString(`base64`)}),te=e=>({toJSON:()=>JSON.stringify(e),toYAML:()=>Object.entries(e).map(([e,t])=>`${e}: ${u(t)}`).join(`
|
|
2
|
+
`),toBinary:()=>Buffer.from(JSON.stringify(e)).toString(`base64`)}),ne=(e,t)=>t(JSON.parse(e)),re=(e,t)=>{let n=e.split(`
|
|
3
|
+
`),r={};for(let e of n){let t=e.indexOf(`: `);if(t===-1)continue;let n=e.substring(0,t),i=e.substring(t+2);if(!i){r[n]=null;continue}try{r[n]=i===`null`?null:JSON.parse(i)}catch{r[n]=i}}return t(r)},ie=(e,t)=>ne(Buffer.from(e,`base64`).toString(),t),ae=e=>({fromJSON:t=>ne(t,e),fromYAML:t=>re(t,e),fromBinary:t=>ie(t,e)}),oe=Set,se=e=>{let t=e;return{get(){return t},set(e){t=e},update(e){t=e(t)},getAndSet(e){let n=t;return t=e,n},updateAndGet(e){return t=e(t),t},getAndUpdate(e){let n=t;return t=e(t),n},compareAndSet(e,n){return t===e?(t=n,!0):!1},modify(e){let[n,r]=e(t);return t=n,r}}},f=n(se,{of:e=>se(e)}),p=(e=0)=>{let t=f(e),n=e;return{get:()=>t.get(),set:e=>t.set(e),increment:()=>t.updateAndGet(e=>e+1),decrement:()=>t.updateAndGet(e=>e-1),reset:()=>t.set(n),compareAndSet:(e,n)=>t.compareAndSet(e,n)}},ce=()=>{let e=f([]);return{add:t=>e.update(e=>[...e,t]),addAll:t=>e.update(e=>[...e,...t]),build:()=>e.get(),clear:()=>e.set([]),size:()=>e.get().length}},m=e=>{let t={_tag:`LazyList`,[Symbol.iterator]:()=>e[Symbol.iterator](),map:t=>m((function*(){for(let n of e)yield t(n)})()),flatMap:t=>m((function*(){for(let n of e)yield*t(n)})()),filter:t=>m((function*(){for(let n of e)t(n)&&(yield n)})()),take:t=>m((function*(){let n=p(0);for(let r of e){if(n.get()>=t)break;yield r,n.increment()}})()),drop:t=>m((function*(){let n=p(0);for(let r of e)n.get()>=t&&(yield r),n.increment()})()),takeWhile:t=>m((function*(){for(let n of e){if(!t(n))break;yield n}})()),dropWhile:t=>m((function*(){let n=f(!0);for(let r of e)n.get()&&t(r)||(n.set(!1),yield r)})()),concat:t=>m((function*(){yield*e,yield*t})()),zip:t=>m((function*(){let n=e[Symbol.iterator](),r=t[Symbol.iterator]();for(;;){let e=n.next(),t=r.next();if(e.done||t.done)break;yield[e.value,t.value]}})()),toList:()=>s(Array.from(e)),toArray:()=>Array.from(e),forEach:t=>{for(let n of e)t(n)},reduce:(t,n)=>{let r=f(n);for(let n of e)r.set(t(r.get(),n));return r.get()},find:t=>{for(let n of e)if(t(n))return i(n);return i.none()},some:t=>{for(let n of e)if(t(n))return!0;return!1},every:t=>{for(let n of e)if(!t(n))return!1;return!0},count:()=>{let t=p(0);for(let n of e)t.increment();return t.get()},get head(){let t=e[Symbol.iterator]().next();return t.done?void 0:t.value},get headOption(){let t=e[Symbol.iterator]().next();return t.done?i.none():i(t.value)},get last(){let t;for(let n of e)t=n;return t},get lastOption(){let t=f(void 0),n=f(!1);for(let r of e)t.set(r),n.set(!0);return n.get()?i(t.get()):i.none()},get tail(){return m((function*(){let t=e[Symbol.iterator]();t.next();let n=t.next();for(;!n.done;)yield n.value,n=t.next()})())},get init(){let t=Array.from(e);return m(t.length===0?[]:t.slice(0,-1))},takeRight:t=>{let n=Array.from(e);return m(t<=0?[]:n.slice(-t))},reverse:()=>m(Array.from(e).reverse()),distinct:()=>m((function*(){let t=new globalThis.Set;for(let n of e)t.has(n)||(t.add(n),yield n)})()),zipWithIndex:()=>m((function*(){let t=p(0);for(let n of e)yield[n,t.get()],t.increment()})()),fold:(t,n)=>{let r=e[Symbol.iterator]().next();return r.done?t():n(r.value)},foldLeft:t=>n=>{let r=f(t);for(let t of e)r.set(n(r.get(),t));return r.get()},foldRight:t=>n=>Array.from(e).reduceRight((e,t)=>n(t,e),t),pipe:e=>e(t),serialize:()=>{let t=Array.from(e);return{toJSON:()=>JSON.stringify({_tag:`LazyList`,value:t}),toYAML:()=>`_tag: LazyList\nvalue: ${u(t)}`,toBinary:()=>Buffer.from(JSON.stringify({_tag:`LazyList`,value:t})).toString(`base64`)}},toString:()=>{let t=[],n=p(0),r=f(!1);for(let i of e)if(n.get()<10)t.push(i),n.increment();else{r.set(!0);break}let i=t.map(e=>String(e)).join(`, `);return r.get()?`LazyList(${i}, ...)`:`LazyList(${i})`}};return t},le=n(e=>m(e),{empty:()=>m([]),of:e=>m([e]),from:(...e)=>m(e),iterate:(e,t)=>m((function*(){let n=f(e);for(;;)yield n.get(),n.set(t(n.get()))})()),generate:e=>m((function*(){for(;;)yield e()})()),range:(e,t,n=1)=>m((function*(){if(n===0)throw Error(`Step cannot be zero`);let r=f(e);if(n>0)for(;r.get()<t;)yield r.get(),r.set(r.get()+n);else for(;r.get()>t;)yield r.get(),r.set(r.get()+n)})()),repeat:(e,t)=>m((function*(){if(t===void 0)for(;;)yield e;else{let n=p(0);for(;n.get()<t;)yield e,n.increment()}})()),cycle:e=>m((function*(){let t=Array.from(e);if(t.length!==0)for(;;)yield*t})())});function ue({_tag:e,impl:t}){return{...t,_tag:e}}function de(e,t){return!e||typeof e!=`object`||!(`_tag`in e)?!1:t?e._tag===t:!0}function h(t,n){return{brand:t,validate:n,of:r=>n(r)?i(e(t,r)):i.none(),from:r=>n(r)?l(e(t,r)):c(`Invalid ${t}: validation failed`),unsafeOf:r=>{if(!n(r))throw Error(`Invalid ${t}: validation failed`);return e(t,r)},is:e=>{try{return n(e)}catch{return!1}},unwrap:e=>e,refine:(e,t)=>h(e,e=>n(e)&&t(e))}}const fe=h(`PositiveNumber`,e=>e>0),pe=h(`NonNegativeNumber`,e=>e>=0),me=h(`IntegerNumber`,e=>Number.isInteger(e)),he=fe.refine(`PositiveInteger`,e=>Number.isInteger(e)),ge=h(`NonEmptyString`,e=>e.length>0),_e=h(`EmailAddress`,e=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)),ve=h(`UrlString`,e=>{try{return new URL(e),!0}catch{return!1}}),ye=h(`UUID`,e=>/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)),be=h(`ISO8601Date`,e=>!isNaN(Date.parse(e))&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(e));function xe(e,t,n){return h(e,e=>e>=t&&e<=n)}function Se(e,t,n){return h(e,e=>e.length>=t&&e.length<=n)}function Ce(e,t){return h(e,e=>t.test(e))}const we=e=>typeof e==`function`&&Object.keys(e).length>0,Te=e=>{let t=e=>typeof e==`function`?e():e,n={when:(r,i)=>e.resolved?n:r?Te({resolved:!0,value:t(i)}):n,elseWhen:(r,i)=>e.resolved?n:r?Te({resolved:!0,value:t(i)}):n,else:n=>e.resolved?e.value:t(n),orThrow:()=>{if(!e.resolved)throw Error(`Conditional expression has no matching condition`);return e.value}};return n},Ee=()=>Te({resolved:!1}),De=n(Ee,{of:()=>Ee(),match:e=>t=>{let n=t[e];if(n===void 0)throw Error(`No case defined for value: ${String(e)}`);return typeof n==`function`?n():n},lazy:()=>{let e={resolved:!1},t={when:(n,r)=>(e.resolved||n()&&(e.resolved=!0,e.value=r()),t),elseWhen:(n,r)=>(e.resolved||n()&&(e.resolved=!0,e.value=r()),t),else:t=>e.resolved?e.value:t()};return t}}),g=(e,t)=>t===e?!0:typeof t==`function`?t(e):t&&typeof t==`object`&&`_`in t?t._(e):typeof t==`object`&&t&&typeof e==`object`&&e?Object.entries(t).every(([t,n])=>{let r=e[t];return g(r,n)}):!1,_=e=>{let t=(e,t)=>typeof e==`function`?e(t):e,n=()=>{for(let{pattern:n,result:r}of e.patterns)if(g(e.value,n))return{matched:!0,result:t(r,e.value)};return{matched:!1}},r={case:(n,i)=>e.resolved?r:g(e.value,n)?_({value:e.value,resolved:!0,result:t(i,e.value),patterns:[]}):_({...e,patterns:[...e.patterns,{pattern:n,result:i}]}),caseValue:(t,n)=>{if(e.resolved)return r;if(e.value===t){let t=typeof n==`function`?n():n;return _({value:e.value,resolved:!0,result:t,patterns:[]})}return r},caseValues:(t,n)=>{if(e.resolved)return r;if(t.includes(e.value)){let t=typeof n==`function`?n():n;return _({value:e.value,resolved:!0,result:t,patterns:[]})}return r},when:(e,t)=>r.case(e,t),caseAny:(n,i)=>{if(e.resolved)return r;for(let r of n)if(g(e.value,r))return _({value:e.value,resolved:!0,result:t(i,e.value),patterns:[]});return _({...e,patterns:[...e.patterns,...n.map(e=>({pattern:e,result:i}))]})},default:n=>e.resolved?e.result:t(n,e.value),exhaustive:()=>{if(e.resolved)return e.result;let t=n();if(!t.matched)throw Error(`Non-exhaustive match. No pattern matched value: ${JSON.stringify(e.value)}`);return t.result},orThrow:t=>{if(e.resolved)return e.result;let r=n();if(!r.matched)throw Error(t??`No matching pattern for value: ${JSON.stringify(e.value)}`);return r.result},toOption:()=>{if(e.resolved)return i(e.result);let t=n();return t.matched?i(t.result):i.none()}};return r},Oe=e=>{let t=(e,t)=>typeof e==`function`?e(t):e;return{case:(n,r)=>{let i={value:e,resolved:!1,patterns:[{pattern:n,result:r}]};return g(e,n)?_({...i,resolved:!0,result:t(r,e)}):_(i)},caseValue:(t,n)=>_(e===t?{value:e,resolved:!0,result:typeof n==`function`?n():n,patterns:[]}:{value:e,resolved:!1,patterns:[]}),caseValues:(t,n)=>t.includes(e)?_({value:e,resolved:!0,result:typeof n==`function`?n():n,patterns:[]}):_({value:e,resolved:!1,patterns:[]}),when:(n,r)=>{let i={value:e,resolved:!1,patterns:[{pattern:n,result:r}]};return n(e)?_({...i,resolved:!0,result:t(r,e)}):_(i)},caseAny:(n,r)=>{for(let i of n)if(g(e,i))return _({value:e,resolved:!0,result:t(r,e),patterns:n.map(e=>({pattern:e,result:r}))});return _({value:e,resolved:!1,patterns:n.map(e=>({pattern:e,result:r}))})}}},ke=n(e=>Oe(e),{exhaustive:e=>t=>{let n=e[t];if(n===void 0)throw Error(`No case defined for value: ${String(t)}`);return n},partial:e=>({withDefault:t=>n=>{let r=e[n];return r===void 0?typeof t==`function`?t(n):t:typeof r==`function`?r(n):r}}),withGuards:e=>({withDefault:t=>n=>{for(let[t,r]of e)if(t(n))return typeof r==`function`?r(n):r;return typeof t==`function`?t(n):t}}),struct:()=>{let e=[],t={case:(n,r)=>(e.push({pattern:n,handler:r}),t),build:()=>t=>{for(let{pattern:n,handler:r}of e)if(g(t,n))return r(t);throw Error(`No matching pattern for value: ${JSON.stringify(t)}`)}};return t},builder:()=>{let e=[],t,n={case:(t,r)=>(e.push({pattern:t,result:r}),n),when:(t,r)=>(e.push({pattern:t,result:r}),n),default:n=>(t=n,{build:()=>n=>{for(let{pattern:t,result:r}of e)if(g(n,t))return typeof r==`function`?r(n):r;if(t!==void 0)return typeof t==`function`?t(n):t;throw Error(`No matching pattern for value: ${JSON.stringify(n)}`)}})};return n}});function v(e,t){return{...ue({_tag:e,impl:t}),toString(){return`${e}()`},doUnwrap(){if(`isSome`in t&&`isNone`in t){if(typeof t.isSome==`function`&&t.isSome()&&`get`in t&&typeof t.get==`function`)return{ok:!0,value:t.get()};if(typeof t.isNone==`function`&&t.isNone())return{ok:!1,empty:!0}}if(`isLeft`in t&&`isRight`in t){if(typeof t.isRight==`function`&&t.isRight()&&`value`in t)return{ok:!0,value:t.value};if(typeof t.isLeft==`function`&&t.isLeft()&&`value`in t)return{ok:!1,empty:!1,error:t.value}}if(`isSuccess`in t&&`isFailure`in t){if(typeof t.isSuccess==`function`&&t.isSuccess()&&`get`in t&&typeof t.get==`function`)return{ok:!0,value:t.get()};if(typeof t.isFailure==`function`&&t.isFailure()&&`getError`in t&&typeof t.getError==`function`)return{ok:!1,empty:!1,error:t.getError()}}if(`isEmpty`in t&&`head`in t){if(typeof t.isEmpty==`function`&&t.isEmpty())return{ok:!1,empty:!0};if(typeof t.head==`function`)return{ok:!0,value:t.head()};if(`head`in t)return{ok:!0,value:t.head}}return{ok:!0,value:t}}}}const y=`Throwable`;var b=class e extends Error{constructor(e,t){super(e,{cause:t?.cause}),this._tag=y,this.name=t?.taskInfo?.name??y,Object.defineProperties(this,{_tag:{value:y,writable:!1,configurable:!1},data:{value:t?.data,writable:!1,configurable:!1},taskInfo:{value:t?.taskInfo,writable:!1,configurable:!1},name:{value:t?.taskInfo?.name??y,writable:!1,configurable:!1}}),t?.cause&&Object.defineProperty(this,`cause`,{value:t.cause,writable:!1,configurable:!1}),t?.stack?this.stack=t.stack:Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}static apply(t,n,r){if(t instanceof Error){let i=new e(t.message,{data:n,cause:t.cause??void 0,stack:t.stack??void 0,taskInfo:r});for(let e of Object.keys(t))if(!(e in i)){let n=i;n[e]=t[e]}return i}if(t&&typeof t==`object`){let i=t,a=new e(typeof i.message==`string`?i.message:typeof i.error==`string`?i.error:`Object error: ${JSON.stringify(i,Object.getOwnPropertyNames(i).filter(e=>i[e]!==void 0))}`,{data:n??i,taskInfo:r});for(let e of Object.keys(i))if(!(e in a)){let t=a;t[e]=i[e]}return a}if(typeof t==`function`){let i=t.name??`anonymous function`,a=t.toString().substring(0,100)+(t.toString().length>100?`...`:``);return new e(`Function error: ${i}`,{data:n??{functionType:typeof t,functionName:i,functionString:a},taskInfo:r})}let i=typeof t,a=t===null?`null`:t===void 0?`undefined`:String(t);if(i===`number`){let a=t;return new e(Number.isNaN(a)?`Number error: NaN`:Number.isFinite(a)?`Number error: ${a}`:`Number error: ${a>0?`Infinity`:`-Infinity`}`,{data:n??{errorType:i,errorValue:a,originalError:t},taskInfo:r})}if(i===`bigint`)return new e(`BigInt error: ${t}n`,{data:n??{errorType:i,errorValue:String(t),originalError:t},taskInfo:r});if(i===`boolean`)return new e(`Boolean error: ${t}`,{data:n??{errorType:i,errorValue:t,originalError:t},taskInfo:r});if(i===`symbol`){let a=t.description??`unnamed symbol`;return new e(`Symbol error: Symbol(${a})`,{data:n??{errorType:i,symbolDescription:a,originalError:t},taskInfo:r})}return new e(typeof t==`string`?t:`${i.charAt(0).toUpperCase()+i.slice(1)} error: ${a}`,{data:n??{errorType:i,errorValue:a,originalError:t},taskInfo:r})}};function Ae(e){return e instanceof Error&&typeof e==`object`&&e._tag===`Throwable`}const je=(e,t)=>{if(e.isRight())return S(e.orThrow(),t);if(e.isLeft())return x(e.fold(e=>e,()=>Error(`Unexpected right value`)),void 0,t);throw Error(`Unrecognized task outcome`)},x=(e,t,n)=>{let i={name:n?.name??`Task`,description:n?.description??``},a=b.apply(e,t,i),l={...v(`Err`,{error:a,meta:i}),_tag:`Err`,_meta:i,value:void 0,error:a,isSuccess(){return!1},isFailure(){return!0},isOk(){return!1},isErr(){return!0},map:e=>x(a,t,n),flatMap:e=>x(a,t,n),ap:e=>x(a,t,n),mapAsync:e=>Promise.resolve(x(a,t,n)),flatMapAsync:e=>Promise.resolve(x(a,t,n)),mapError:e=>x(e(a),t,n),recover:e=>S(e,n),recoverWith:e=>S(e(a),n),orThrow:e=>{throw e??a},orElse:e=>e,or:e=>e,orNull:()=>null,orUndefined:()=>void 0,toEither:()=>c(a),toTry:()=>o(()=>{throw a}),toOption:()=>r(),toList:()=>s([]),fold:(e,t)=>e(a),match:e=>e.Err(a),foldLeft:e=>t=>e,foldRight:e=>t=>e,size:0,isEmpty:!0,contains:e=>!1,reduce:e=>{throw Error(`Cannot reduce empty Err`)},reduceRight:e=>{throw Error(`Cannot reduceRight empty Err`)},count:e=>0,find:e=>r(),exists:e=>!1,forEach:e=>{},toPromise:()=>Promise.reject(a),doUnwrap(){return{ok:!1,empty:!1,error:a}},serialize:()=>({toJSON:()=>u({_tag:`Err`,error:a.message??a.toString()})??`{}`,toYAML:()=>`_tag: Err\nerror: ${a.message??a.toString()}`,toBinary:()=>Buffer.from(JSON.stringify({_tag:`Err`,error:a.message??a.toString()})).toString(`base64`)}),pipe:e=>e(l)};return l},S=(e,t)=>{let n={name:t?.name??`Task`,description:t?.description??``},i={...v(`Ok`,{value:e,meta:n}),_tag:`Ok`,_meta:n,value:e,error:void 0,isSuccess(){return!0},isFailure(){return!1},isOk(){return!0},isErr(){return!1},map:n=>S(n(e),t),flatMap:n=>{let r=n(e);return r&&typeof r==`object`&&`isLeft`in r&&`isRight`in r?je(r,t):r},ap:n=>n.isOk()?S(n.value(e),t):x(n.error,void 0,t),mapAsync:async n=>S(await n(e),t),flatMapAsync:async t=>await t(e),mapError:n=>S(e,t),recover:n=>S(e,t),recoverWith:n=>S(e,t),orThrow:t=>e,orElse:t=>e,or:n=>S(e,t),orNull:()=>e,orUndefined:()=>e,toEither:()=>l(e),toTry:()=>o(()=>e),toOption:()=>a(e),toList:()=>s([e]),fold:(t,n)=>n(e),match:t=>t.Ok(e),foldLeft:t=>n=>n(t,e),foldRight:t=>n=>n(e,t),size:1,isEmpty:!1,contains:t=>e===t,reduce:t=>e,reduceRight:t=>e,count:t=>t(e)?1:0,find:t=>t(e)?a(e):r(),exists:t=>t(e),forEach:t=>t(e),toPromise:()=>Promise.resolve(e),doUnwrap(){return{ok:!0,value:e}},serialize:()=>({toJSON:()=>u({_tag:`Ok`,value:e})??`{}`,toYAML:()=>`_tag: Ok\nvalue: ${u(e)??`undefined`}`,toBinary:()=>Buffer.from(JSON.stringify({_tag:`Ok`,value:e})).toString(`base64`)}),pipe:e=>e(i)};return i},C=()=>{let e=new AbortController,t=ce();return{token:{get isCancelled(){return e.signal.aborted},get signal(){return e.signal},onCancel(n){e.signal.aborted?n():t.add(n)}},cancel(){e.signal.aborted||(e.abort(),t.build().forEach(e=>{try{e()}catch(e){console.error(`Error in cancellation callback:`,e)}}))}}},Me=e=>{let t=e?.name??`Task`,n=e?.description??``,r={Async:(e,r=e=>e,i=()=>{},a)=>new Promise(o=>{(async()=>{let s=f(!1),c=f(null),l=f(()=>{});if(a){if(a.isCancelled){try{await i()}catch(e){o(x(e,void 0,{name:t,description:n}));return}o(x(Error(`Task was cancelled before execution started`),void 0,{name:t,description:n}));return}a.onCancel(()=>{s.set(!0),c.set(Error(`Task was cancelled during execution`))}),l.set(()=>{})}try{let r=await e();try{await i()}catch(e){o(x(e,void 0,{name:t,description:n}));return}if(s.get()){c.get()?o(x(c.get(),void 0,{name:t,description:n})):o(x(Error(`Task was cancelled during execution`),void 0,{name:t,description:n}));return}if(r&&typeof r==`object`&&`_tag`in r){let e=r;e._tag===`Ok`||e._tag===`Err`?o(e):o(S(r,{name:t,description:n}))}else o(S(r,{name:t,description:n}))}catch(e){try{await i()}catch(e){o(x(e,void 0,{name:t,description:n}));return}if(s.get()){c.get()?o(x(c.get(),void 0,{name:t,description:n})):o(x(Error(`Task was cancelled during execution`),void 0,{name:t,description:n}));return}try{if(e instanceof Error&&Ae(e)){let i=Error(`${t}: ${e.message}`),a=b.apply(i,void 0,{name:t,description:n});Object.defineProperty(a,`cause`,{value:e,writable:!1,configurable:!1}),Promise.resolve().then(()=>{try{r(e)}catch(e){console.error(`Error in error handler:`,e)}}),o(x(a,void 0,{name:t,description:n}))}else{let i=await r(e);if(i&&typeof i==`object`&&`_tag`in i){let e=i;e._tag===`Ok`||e._tag===`Err`?o(e):o(x(i,void 0,{name:t,description:n}))}else o(x(i,void 0,{name:t,description:n}))}}catch(e){o(x(e,void 0,{name:t,description:n}))}}finally{l.get()()}})().catch(e=>o(x(e,void 0,{name:t,description:n})))}),Sync:(e,r=e=>e,i=()=>{})=>{try{return S(e(),{name:t,description:n})}catch(e){return x(r(e),void 0,{name:t,description:n})}finally{i()}},AsyncWithProgress:(e,t,n=e=>e,i=()=>{},a)=>{let o=e=>{let n=Math.max(0,Math.min(100,e));n<=100&&t(n)};return r.Async(()=>e(o),n,i,a)}};return{...v(`Task`,r),_type:`Task`}},Ne={success:(e,t)=>S(e,t),fail:(e,t,n)=>x(e,t,n),ok:(e,t)=>S(e,t),err:(e,t,n)=>x(e,t,n),fromEither:(e,t)=>je(e,t),fromTry:(e,t)=>e.isSuccess()?S(e.orThrow(),t):x(e.fold(e=>e,()=>Error(`Unexpected success`)),void 0,t),getErrorChain:e=>{if(!e)return[];let t=ce();t.add(e);let n=f(e);for(;n.get()&&n.get().cause;){let{cause:e}=n.get();if(e)t.add(e),n.set(e);else break;if(t.size()>100)break}return t.build()},formatErrorChain:(e,t)=>{let n=Ne.getErrorChain(e),r=t?.separator??`
|
|
4
|
+
`;return n.map((e,n)=>{if(!e)return`${n>0?`↳ `:``}Unknown error`;let{taskInfo:r}=e,i=t?.includeTasks&&r?.name?`[${r.name}] `:``,a=e.message??`No message`,o=f(`${n>0?`↳ `:``}${i}${a}`);return t?.includeStackTrace&&e.stack&&o.set(`${o.get()}\n${e.stack.split(`
|
|
5
|
+
`).slice(1).join(`
|
|
6
|
+
`)}`),o.get()}).join(r)},fromPromise:(e,t)=>(...n)=>w(t??{name:`PromiseTask`,description:`Task from Promise`}).Async(()=>e(...n),e=>e),toPromise:e=>new Promise((t,n)=>{e.isSuccess()?t(e.orThrow()):n(e.error)}),race:(e,t,n)=>w({name:n?.name??`TaskRace`,description:n?.description??`Race between multiple tasks`}).Async(async()=>{let n=ce();e.forEach(e=>n.add(e));let r=f(void 0);if(typeof t==`number`&&t>0){let e=new Promise((e,n)=>{r.set(setTimeout(()=>{n(Error(`Task race timed out after ${t}ms`))},t))});n.add(e)}try{return await new Promise((e,t)=>{n.build().forEach(n=>{n.then(n=>{if(n&&typeof n==`object`&&`_tag`in n){let r=n;r._tag===`Ok`?e(r.orThrow()):r._tag===`Err`?t(r.error):e(n)}else e(n)},e=>t(e))})})}finally{r.get()&&clearTimeout(r.get())}},e=>e),fromNodeCallback:(e,t)=>{let n={name:t?.name??`NodeCallbackTask`,description:t?.description??`Task from Node.js callback function`};return(...t)=>w(n).Async(()=>new Promise((n,r)=>{try{e(...t,(e,t)=>{e?r(e):n(t)})}catch(e){r(e)}}),e=>e)},createCancellationTokenSource:C,cancellable:(e,t)=>{let n=C();return{task:w(t).Async(()=>e(n.token),e=>e,()=>{},n.token),cancel:()=>n.cancel()}},withProgress:(e,t=()=>{},n)=>{let r=C(),i=f(0),a=e=>{i.set(Math.max(0,Math.min(100,e))),t(i.get())};return{task:w(n).Async(()=>e(a,r.token),e=>e,()=>{},r.token),cancel:()=>r.cancel(),currentProgress:()=>i.get()}}},w=n(Me,Ne),Pe={includeTasks:!0,includeStackTrace:!1,separator:`
|
|
7
|
+
`,includeData:!1,maxStackFrames:3,title:`Error`,colors:!1};function Fe(e){let t=new WeakSet;return JSON.stringify(e,(e,n)=>{if(typeof n==`bigint`)return`${n.toString()}n`;if(typeof n==`object`&&n){if(t.has(n))return`[Circular Reference]`;t.add(n)}return e===`stack`&&typeof n==`string`?T(n):n},2)}function T(e){if(e===void 0||e===``)return``;let t=e.split(`
|
|
8
|
+
`);return[t[0],...t.slice(1).map(e=>e.trim())].join(`
|
|
9
|
+
`)}function Ie(e,t){let n={...Pe,...t},r=e instanceof Error?e:b.apply(e),i=w?.getErrorChain?w.getErrorChain(r):[r],a=`${n.colors?`\x1b[31m${n.title}:\x1b[0m ${r.message}`:`${n.title}: ${r.message}`}\n\n${i.map((e,t)=>{let r=` `.repeat(t),i=t>0?`↳ `:``,{taskInfo:a}=e,o=`${r}${i}${n.includeTasks&&a?.name?n.colors?`\x1b[36m[${a.name}]\x1b[0m `:`[${a.name}] `:``}${e.message}`;if(n.includeStackTrace&&e.stack){let t=T(e.stack).split(`
|
|
10
|
+
`).slice(1),i=n.maxStackFrames??Pe.maxStackFrames??3,a=t.slice(0,i).map(e=>`${r} ${n.colors?`\x1B[90m`:``}${e}${n.colors?`\x1B[0m`:``}`).join(`
|
|
11
|
+
`);o+=`\n${a}`,t.length>i&&(o+=`\n${r} ${n.colors?`\x1B[90m`:``}...${t.length-i} more stack frames${n.colors?`\x1B[0m`:``}`)}return o}).join(n.separator)}`;if(n.includeData){let{data:e}=r;if(e){let t=n.colors?`\n\n\x1b[33mContext:\x1b[0m\n${Fe(e)}`:`\n\nContext:\n${Fe(e)}`;a+=t}}return a}function Le(){return function(e){if(!e)return e;let t=e instanceof Error?e:Error(String(e)),n={message:t.message,name:t.name||`Error`,stack:t.stack?T(t.stack):void 0};if(t.taskInfo&&(n.taskInfo=t.taskInfo),t.data&&(n.data=t.data),typeof w?.getErrorChain==`function`)try{let e=w.getErrorChain(t);e.length>1&&(n.errorChain=w.formatErrorChain(t,{includeTasks:!0}),n.structuredErrorChain=e.map(e=>({message:e.message,name:e.name,taskInfo:e.taskInfo,stack:e.stack?T(e.stack):void 0})))}catch{}return Object.getOwnPropertyNames(t).forEach(e=>{n[e]||(n[e]=t[e])}),n}}const E=(e,n,r,i)=>t(b.apply(n,r,{name:e,description:n}),{code:e,message:n,status:Re(e),context:r,timestamp:new Date().toISOString(),traceId:i?.traceId}),Re=e=>({VALIDATION_FAILED:400,BAD_REQUEST:400,AUTH_REQUIRED:401,PERMISSION_DENIED:403,NOT_FOUND:404,TIMEOUT:408,CONFLICT:409,RATE_LIMITED:429,INTERNAL_ERROR:500,NETWORK_ERROR:503})[e],D=Object.assign(E,{validation:(e,t,n)=>E(`VALIDATION_FAILED`,`Validation failed: ${e} ${n}`,{field:e,value:t,rule:n}),network:(e,t,n)=>E(`NETWORK_ERROR`,`Network error: ${t} ${e}${n?` (${n})`:``}`,{url:e,method:t,statusCode:n}),auth:(e,t)=>E(`AUTH_REQUIRED`,`Authentication required: ${e}${t?` (role: ${t})`:``}`,{resource:e,requiredRole:t}),notFound:(e,t)=>E(`NOT_FOUND`,`Not found: ${e} with id ${t}`,{resource:e,id:t}),permission:(e,t,n)=>E(`PERMISSION_DENIED`,`Permission denied: cannot ${e} ${t}`,{action:e,resource:t,userId:n}),rateLimit:(e,t,n)=>E(`RATE_LIMITED`,`Rate limit exceeded: ${e} requests per ${t}`,{limit:e,window:t,retryAfter:n}),internal:e=>E(`INTERNAL_ERROR`,`Internal server error: ${e}`,{errorId:e,timestamp:new Date().toISOString()}),badRequest:(e,t)=>E(`BAD_REQUEST`,`Bad request: ${e}`,{reason:e,expected:t}),conflict:(e,t)=>E(`CONFLICT`,`Conflict: ${e} already exists with value ${t}`,{resource:e,conflictingValue:t}),timeout:(e,t)=>E(`TIMEOUT`,`Request timeout: ${t} exceeded ${e}ms`,{duration:e,operation:t}),isTypedError:e=>typeof e==`object`&&!!e&&`code`in e&&`message`in e&&`status`in e&&`context`in e&&`_tag`in e&&e._tag===`Throwable`,hasCode:(e,t)=>e.code===t}),O={rule:e=>t=>{if(e===`email`)return typeof t!=`string`||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)?c(D.validation(`value`,t,`must be a valid email`)):l(t);if(e===`url`)try{return new URL(String(t)),l(t)}catch{return c(D.validation(`value`,t,`must be a valid URL`))}if(e===`uuid`)return typeof t!=`string`||!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t)?c(D.validation(`value`,t,`must be a valid UUID`)):l(t);if(e===`required`)return t==null||t===``?c(D.validation(`value`,t,`is required`)):l(t);if(e===`numeric`)return typeof t!=`number`&&!/^\d+$/.test(String(t))?c(D.validation(`value`,t,`must be numeric`)):l(t);if(e===`alpha`)return typeof t!=`string`||!/^[a-zA-Z]+$/.test(t)?c(D.validation(`value`,t,`must contain only letters`)):l(t);if(e===`alphanumeric`)return typeof t!=`string`||!/^[a-zA-Z0-9]+$/.test(t)?c(D.validation(`value`,t,`must be alphanumeric`)):l(t);if(e.startsWith(`min:`)){let n=Number(e.split(`:`)[1]),r=Number(t);return isNaN(r)||r<n?c(D.validation(`value`,t,`must be at least ${n}`)):l(t)}if(e.startsWith(`max:`)){let n=Number(e.split(`:`)[1]),r=Number(t);return isNaN(r)||r>n?c(D.validation(`value`,t,`must be at most ${n}`)):l(t)}if(e.startsWith(`minLength:`)){let n=Number(e.split(`:`)[1]);return String(t).length<n?c(D.validation(`value`,t,`must be at least ${n} characters`)):l(t)}if(e.startsWith(`maxLength:`)){let n=Number(e.split(`:`)[1]);return String(t).length>n?c(D.validation(`value`,t,`must be at most ${n} characters`)):l(t)}if(e.startsWith(`pattern:`)){let n=e.substring(8);return new RegExp(n).test(String(t))?l(t):c(D.validation(`value`,t,`must match pattern ${n}`))}if(e.startsWith(`in:`)){let n=e.substring(3).split(`,`);return n.includes(String(t))?l(t):c(D.validation(`value`,t,`must be one of: ${n.join(`, `)}`))}if(e.startsWith(`notIn:`)){let n=e.substring(6).split(`,`);return n.includes(String(t))?c(D.validation(`value`,t,`must not be one of: ${n.join(`, `)}`)):l(t)}if(e===`date`){let e=new Date(String(t));return isNaN(e.getTime())?c(D.validation(`value`,t,`must be a valid date`)):l(t)}if(e===`future`){let e=new Date(String(t));return isNaN(e.getTime())||e<=new Date?c(D.validation(`value`,t,`must be a future date`)):l(t)}if(e===`past`){let e=new Date(String(t));return isNaN(e.getTime())||e>=new Date?c(D.validation(`value`,t,`must be a past date`)):l(t)}return l(t)},combine:(...e)=>t=>{for(let n of e){let e=n(t);if(e.isLeft())return e}return l(t)},custom:(e,t)=>n=>e(n)?l(n):c(D.validation(`value`,n,t)),form:(e,t)=>{let n=[],r={};for(let[i,a]of Object.entries(e)){let e=t[i],o=a(e);if(o.isLeft()){let t=o.fold(e=>e,()=>{throw Error(`Should not be left`)}),r=D.validation(i,e,t.context.rule);n.push(r)}else r[i]=o.orThrow()}return n.length>0?c(s(n)):l(r)}},ze={...O,validators:{email:O.rule(`email`),url:O.rule(`url`),uuid:O.rule(`uuid`),required:O.rule(`required`),numeric:O.rule(`numeric`),positiveNumber:O.combine(O.rule(`numeric`),O.rule(`min:0`)),nonEmptyString:O.combine(O.rule(`required`),O.custom(e=>typeof e==`string`&&e.trim().length>0,`must not be empty`))}},Be=t(O.rule,ze);function Ve(e){return typeof e==`object`&&!!e&&`orThrow`in e&&typeof e.orThrow==`function`}function He(e){return Ve(e)&&`orElse`in e&&typeof e.orElse==`function`&&`or`in e&&typeof e.or==`function`&&`orNull`in e&&typeof e.orNull==`function`&&`orUndefined`in e&&typeof e.orUndefined==`function`}const Ue={toOption:e=>e.fold(()=>r(),e=>a(e)),toList:e=>e.fold(()=>s([]),e=>s([e])),toEither:(e,t)=>e.fold(()=>c(t),e=>l(e)),isEmpty:e=>e.fold(()=>!0,()=>!1),size:e=>e.fold(()=>0,()=>1)},k=e=>typeof e==`object`&&!!e&&(e._tag===`Some`||e._tag===`None`),A=e=>typeof e==`object`&&!!e&&e._tag===`List`,j=e=>typeof e==`object`&&!!e&&(e._tag===`Left`||e._tag===`Right`),M=e=>typeof e==`object`&&!!e&&(e._tag===`Success`||e._tag===`Failure`),N=()=>{let e=(e,t)=>{if(k(e)||A(e)||j(e)||M(e))return e.map(e=>t(e));throw Error(`Unsupported functor type: ${JSON.stringify(e)}`)},t=e=>{if(k(e))return e.orThrow();if(A(e)){let t=e.toArray();if(t.length>0&&A(t[0])){let e=[];for(let n of t)A(n)&&e.push(...n.toArray());return s(e)}return e.flatten()}if(j(e))return e.isRight()?e.fold(()=>null,e=>e):e;if(M(e))return e.isSuccess()?e.orThrow():e;throw Error(`Unsupported functor type for flatten: ${JSON.stringify(e)}`)},n=(e,t)=>{if(k(e)||A(e)||j(e)||M(e))return e.flatMap(e=>t(e));throw Error(`Unsupported functor type for flatMap: ${JSON.stringify(e)}`)},r=(e,t)=>{if(k(e)&&k(t)||A(e)&&A(t)||j(e)&&j(t)||M(e)&&M(t))return e.flatMap(e=>t.map(t=>e(t)));throw Error(`Unsupported functor type for ap: ${JSON.stringify(e)}`)},a=e=>{if(k(e)){let t=e;if(t.isEmpty)return s([i.none()]);let n=t.orThrow();if(A(n))return n.map(e=>i(e));throw Error(`Unsupported inner container type for sequence`)}if(A(e)){let t=e.toArray();if(t.length===0)return i.none();let n=t[0];if(k(n)){for(let e of t)if(e.isEmpty)return i.none();return i(s(t.map(e=>e.orThrow())))}throw Error(`Unsupported inner container type for sequence`)}throw Error(`Unsupported outer container type for sequence: ${JSON.stringify(e)}`)};return{_tag:`HKT`,map:e,flatten:t,flatMap:n,ap:r,sequence:a,traverse:(t,n)=>a(e(t,e=>n(e))),_type:`HKT`}},P=N();N.map=(e,t)=>P.map(e,t),N.flatten=e=>P.flatten(e),N.flatMap=(e,t)=>P.flatMap(e,t),N.ap=(e,t)=>P.ap(e,t),N.sequence=e=>P.sequence(e),N.traverse=(e,t)=>P.traverse(e,t),N.isOption=k,N.isList=A,N.isEither=j,N.isTry=M;const We=e=>({id:e,isSame:t=>t.id===e}),Ge=n(We,{of:e=>We(e),pure:e=>We(e)}),Ke=e=>({_tag:`Context`,services:e,get(t){let n=e.get(t.id);return n===void 0?r():a(n)},unsafeGet(t){let n=e.get(t.id);if(n===void 0)throw Error(`Service not found: ${t.id}`);return n},has(t){return e.has(t.id)},add(t,n){let r=new Map(e);return r.set(t.id,n),Ke(r)},merge(t){let n=new Map(e);for(let[e,r]of t.services)n.set(e,r);return Ke(n)},get size(){return e.size},toString(){return`Context(${Array.from(e.keys()).join(`, `)})`}}),F={empty:()=>Ke(new Map),make:(e,t)=>{let n=new Map;return n.set(e.id,t),Ke(n)},isContext:e=>typeof e==`object`&&!!e&&e._tag===`Context`},I=e=>({_tag:`Success`,isSuccess(){return!0},isFailure(){return!1},isInterrupted(){return!1},map(t){return I(t(e))},mapError(t){return I(e)},mapBoth(t,n){return I(n(e))},flatMap(t){return t(e)},fold(t,n,r){return n(e)},match(t){return t.Success(e)},orThrow(){return e},orElse(t){return e},toOption(){return a(e)},toEither(){return l(e)},toValue(){return{_tag:`Success`,value:e}},toString(){return`Exit.Success(${u(e)})`},toJSON(){return{_tag:`Success`,value:e}}}),L=e=>({_tag:`Failure`,isSuccess(){return!1},isFailure(){return!0},isInterrupted(){return!1},map(t){return L(e)},mapError(t){return L(t(e))},mapBoth(t,n){return L(t(e))},flatMap(t){return L(e)},fold(t,n,r){return t(e)},match(t){return t.Failure(e)},orThrow(){throw e},orElse(e){return e},toOption(){return r()},toEither(){return c(e)},toValue(){return{_tag:`Failure`,error:e}},toString(){return`Exit.Failure(${u(e)})`},toJSON(){return{_tag:`Failure`,error:e}}}),R=e=>({_tag:`Interrupted`,isSuccess(){return!1},isFailure(){return!1},isInterrupted(){return!0},map(t){return R(e)},mapError(t){return R(e)},mapBoth(t,n){return R(e)},flatMap(t){return R(e)},fold(t,n,r){if(r)return r(e);throw Error(`Effect was interrupted: ${e}`)},match(t){return t.Interrupted(e)},orThrow(){throw Error(`Effect was interrupted: ${e}`)},orElse(e){return e},toOption(){return r()},toEither(){throw Error(`Cannot convert Interrupted Exit to Either: ${e}`)},toValue(){return{_tag:`Interrupted`,fiberId:e}},toString(){return`Exit.Interrupted(${e})`},toJSON(){return{_tag:`Interrupted`,fiberId:e}}}),z=n(e=>I(e),{succeed:e=>I(e),fail:e=>L(e),interrupt:e=>R(e),interrupted:()=>R(`interrupted`),isSuccess:e=>e.isSuccess(),isFailure:e=>e.isFailure(),isInterrupted:e=>e.isInterrupted(),fromEither:e=>e.isRight()?I(e.value):L(e.value),fromOption:(e,t)=>e.isSome()?I(e.value):L(t()),zip:(e,t)=>e.isInterrupted()?e:t.isInterrupted()?t:e.isFailure()?e:t.isFailure()?t:I([e.orThrow(),t.orThrow()]),all:e=>{let t=[];for(let n of e){if(n.isInterrupted()||n.isFailure())return n;t.push(n.orThrow())}return I(t)}}),B=e=>e;var qe=class extends Error{constructor(e,t){super(t??`Effect timed out after ${e}ms`),this.duration=e,this._tag=`TimeoutError`,this.name=`TimeoutError`}},V=class extends Error{constructor(e){super(e??`Effect was interrupted`),this._tag=`InterruptedError`,this.name=`InterruptedError`}};const H=e=>{let t={_effect:e,map(e){return H(B({_tag:`Map`,effect:t,f:e}))},flatMap(e){return H(B({_tag:`FlatMap`,effect:t,f:e}))},tap(e){return t.map(t=>(e(t),t))},tapEffect(e){return t.flatMap(t=>e(t).map(()=>t))},mapError(e){return H(B({_tag:`MapError`,effect:t,f:e}))},tapError(e){return t.mapError(t=>(e(t),t))},recover(e){return H(B({_tag:`Recover`,effect:t,fallback:e}))},recoverWith(e){return H(B({_tag:`RecoverWith`,effect:t,f:e}))},fold(e,n){return H(B({_tag:`Fold`,effect:t,onFailure:e,onSuccess:n}))},match(e){return t.fold(e.failure,e.success)},catchTag(e,n){return H(B({_tag:`RecoverWith`,effect:t,f:t=>typeof t==`object`&&t&&`_tag`in t&&t._tag===e?B(n(t)):B(G.fail(t))}))},catchAll(e){return t.recoverWith(e)},retry(e){return e<=0?t:t.recoverWith(()=>t.retry(e-1))},retryWithDelay(e,n){return e<=0?t:t.recoverWith(()=>G.sleep(n).flatMap(()=>t.retryWithDelay(e-1,n)))},zipRight(e){return t.flatMap(()=>e)},zipLeft(e){return t.flatMap(t=>e.map(()=>t))},zip(e){return t.flatMap(t=>e.map(e=>[t,e]))},flatten(){return this.flatMap(e=>e)},provideContext(e){return H(B({_tag:`ProvideContext`,effect:t,context:e}))},provideService(e,n){return H(B({_tag:`ProvideContext`,effect:t,context:F.make(e,n)}))},provideLayer(e){return B(B(G.async(async()=>{let t=F.empty();return await e.build(B(t))})).flatMap(e=>H(B({_tag:`ProvideContext`,effect:t,context:e}))))},async run(){let e=await W(this._effect);return e.isSuccess()?l(e.orThrow()):c(e.isFailure()?e.toValue().error:new V)},async runOrThrow(){let e=await W(this._effect);if(e.isSuccess())return e.orThrow();throw e.isFailure()?e.toValue().error:new V},runSync(){try{return l(U(this._effect))}catch(e){return c(e)}},runSyncOrThrow(){return U(this._effect)},async runExit(){return W(this._effect)},async runOption(){let e=await W(this._effect);return e.isSuccess()?a(e.orThrow()):r()},async runTry(){let e=await W(this._effect);if(e.isSuccess())return B(o(()=>e.orThrow()));let t=e.isFailure()?e.toValue().error:Error(`Effect was interrupted`);return B(o(()=>{throw t}))},pipe(e){return e(t)},delay(e){return B(G.async(()=>new Promise(t=>setTimeout(t,e))).flatMap(()=>t))},timeout(e){return H(B({_tag:`Timeout`,effect:t,duration:e}))},timeoutTo(e,n){return B(t.timeout(e).recover(B(n)))},toString(){return`IO(${u(e._tag)})`},toJSON(){return{_tag:`IO`,effect:e._tag}},*[Symbol.iterator](){return yield t}};return t},U=(e,t=F.empty())=>{switch(e._tag){case`Succeed`:return e.value;case`Fail`:throw e.error;case`Die`:throw e.defect;case`Sync`:return e.thunk();case`Async`:throw Error(`Cannot run async effect synchronously`);case`Auto`:{let t=e.thunk();if(t instanceof Promise)throw Error(`Cannot run async effect synchronously`);return t}case`Map`:{let n=U(e.effect._effect,t);return e.f(n)}case`FlatMap`:{let n=U(e.effect._effect,t);return U(e.f(n)._effect,t)}case`MapError`:try{return U(e.effect._effect,t)}catch(t){throw e.f(t)}case`Recover`:try{return U(e.effect._effect,t)}catch{return e.fallback}case`RecoverWith`:try{return U(e.effect._effect,t)}catch(n){return U(e.f(n)._effect,t)}case`Fold`:try{let n=U(e.effect._effect,t);return e.onSuccess(n)}catch(t){return e.onFailure(t)}case`Service`:{let n=t.get(e.tag);if(n.isNone())throw Error(`Service not found: ${e.tag.id}`);return n.orThrow()}case`ProvideContext`:{let n=t.merge(e.context);return U(e.effect._effect,n)}case`Interrupt`:throw new V;case`Bracket`:{let n=U(e.acquire._effect,t);try{return U(e.use(n)._effect,t)}finally{U(e.release(n)._effect,t)}}case`Race`:throw Error(`Cannot run race effect synchronously`);case`Timeout`:throw Error(`Cannot run timeout effect synchronously`)}},W=async(e,t=F.empty())=>{try{switch(e._tag){case`Succeed`:return B(z.succeed(e.value));case`Fail`:return B(z.fail(e.error));case`Die`:throw e.defect;case`Sync`:return B(z.succeed(e.thunk()));case`Async`:{let t=await e.thunk();return B(z.succeed(t))}case`Auto`:{let t=e.thunk();return t instanceof Promise?B(z.succeed(await t)):B(z.succeed(t))}case`Map`:{let n=await W(e.effect._effect,t);return n.isSuccess()?B(z.succeed(e.f(n.orThrow()))):B(n)}case`FlatMap`:{let n=await W(e.effect._effect,t);return n.isSuccess()?W(e.f(n.orThrow())._effect,t):B(n)}case`MapError`:{let n=await W(e.effect._effect,t);return n.isSuccess()?B(n):n.isFailure()?B(z.fail(e.f(n.toValue().error))):B(n)}case`Recover`:{let n=await W(e.effect._effect,t);return n.isSuccess()?n:z.succeed(e.fallback)}case`RecoverWith`:{let n=await W(e.effect._effect,t);return n.isSuccess()?n:n.isFailure()?W(e.f(n.toValue().error)._effect,t):n}case`Fold`:{let n=await W(e.effect._effect,t);return n.isSuccess()?z.succeed(e.onSuccess(n.orThrow())):n.isFailure()?z.succeed(e.onFailure(n.toValue().error)):n}case`Service`:{let n=t.get(e.tag);return n.isNone()?z.fail(Error(`Service not found: ${e.tag.id}`)):z.succeed(n.orThrow())}case`ProvideContext`:{let n=t.merge(e.context);return W(e.effect._effect,n)}case`Interrupt`:return z.interrupted();case`Bracket`:{let n=await W(e.acquire._effect,t);if(!n.isSuccess())return n;let r=n.orThrow();try{return await W(e.use(r)._effect,t)}finally{await W(e.release(r)._effect,t)}}case`Race`:return e.effects.length===0?z.fail(Error(`No effects to race`)):await Promise.race(e.effects.map(e=>W(e._effect,t)));case`Timeout`:{let n=new Promise(t=>setTimeout(()=>t(z.fail(new qe(e.duration))),e.duration)),r=W(e.effect._effect,t);return Promise.race([r,n])}}}catch(e){return z.fail(e)}},G={sync:e=>H({_tag:`Sync`,thunk:e}),succeed:e=>H({_tag:`Succeed`,value:e}),fail:e=>H({_tag:`Fail`,error:e}),die:e=>H({_tag:`Die`,defect:e}),async:e=>H(B({_tag:`Async`,thunk:e})),tryPromise:e=>H({_tag:`Async`,thunk:e.try}).mapError(e.catch),tryCatch:(e,t)=>G.sync(()=>{try{return e()}catch(e){throw t(e)}}),liftSync:e=>(...t)=>G.sync(()=>e(...t)),liftPromise:e=>(...t)=>G.async(()=>e(...t)),fromEither:e=>B(e.isRight()?G.succeed(e.value):G.fail(e.value)),fromOption:e=>B(e.isSome()?G.succeed(e.value):G.fail(void 0)),fromOptionOrFail:(e,t)=>B(e.isSome()?G.succeed(e.value):G.fail(t())),fromTry:e=>B(e.isSuccess()?G.succeed(e.orThrow()):G.fail(e.error)),fromResult:e=>B(e.error?G.fail(e.error):G.succeed(i(e.data))),tryAsync:(e,t,n)=>n?.aborted?B(G.fail(t(n.reason??new DOMException(`Aborted`,`AbortError`)))):G.async(()=>e(n)).mapError(t),asyncResult:(e,t,n)=>{let r=n?.dataKey??`data`,i=n?.errorKey??`error`;return G.tryAsync(t=>e(t),t,n?.signal).flatMap(e=>G.fromResult({data:e[r],error:e[i]}))},service:e=>H({_tag:`Service`,tag:e}),serviceWith:(e,t)=>G.service(e).map(t),serviceWithIO:(e,t)=>G.service(e).flatMap(t),withServices:(e,t)=>{let n=Object.entries(e);if(n.length===0)return B(H({_tag:`Auto`,thunk:()=>t({})}));let r=B(G.succeed({}));return B(n.reduce((e,[t,n])=>B(e.flatMap(e=>G.service(n).map(n=>({...e,[t]:n})))),r).flatMap(e=>H({_tag:`Auto`,thunk:()=>t(e)})))},all:e=>{if(e.length===0)return B(G.succeed([]));let t=B(G.succeed([]));return B(e.reduce((e,t)=>e.flatMap(e=>t.map(t=>[...e,t])),t))},firstSuccessOf:e=>e.length===0?B(G.fail(Error(`No effects provided`))):e.reduce((e,t)=>e.recoverWith(()=>t)),sleep:e=>B(G.async(()=>new Promise(t=>setTimeout(t,e)))),never:()=>B(G.async(()=>new Promise(()=>{}))),get unit(){return B(H({_tag:`Succeed`,value:void 0}))},fromNullable:e=>B(e==null?G.fail(void 0):G.succeed(e)),interrupt:()=>H({_tag:`Interrupt`}),bracket:(e,t,n)=>H({_tag:`Bracket`,acquire:e,use:t,release:n}),acquireRelease:(e,t,n)=>G.bracket(e,t,n),race:e=>H({_tag:`Race`,effects:e}),any:e=>e.length===0?B(G.fail(Error(`No effects provided`))):e.reduce((e,t)=>e.recoverWith(()=>t)),forEach:(e,t)=>{if(e.length===0)return B(G.succeed([]));let n=B(G.succeed([]));return B(e.reduce((e,n)=>e.flatMap(e=>t(n).map(t=>[...e,t])),n))},forEachPar:(e,t)=>G.forEach(e,t),timeout:(e,t)=>H(B({_tag:`Timeout`,effect:e,duration:t})),gen:e=>B(G.sync(()=>{let t=e(),n=e=>{let r=t.next(e);return r.done?B(G.succeed(r.value)):B(r.value.flatMap(e=>n(e)))};return n(void 0)}).flatMap(e=>e)),get Do(){return K(G.succeed({}))}},K=e=>({effect:e,bind(t,n){return K(e.flatMap(e=>n(e).map(n=>({...e,[t]:n}))))},let(t,n){return K(e.map(e=>({...e,[t]:n(e)})))},map(t){return e.map(t)},flatMap(t){return e.flatMap(t)},tap(t){return K(e.tap(t))},tapEffect(t){return K(e.tapEffect(t))},done(){return e}}),q=n(e=>H(B({_tag:`Auto`,thunk:e})),G),J=(e,t)=>({_tag:`Layer`,build:e,provideToAndMerge(t){return J(async n=>{let r=await e(n),i=n.merge(r),a=await t.build(i);return r.merge(a)})},merge(t){return J(async n=>{let[r,i]=await Promise.all([e(n),t.build(n)]);return r.merge(i)})},map(t){return J(async n=>t(await e(n)))},toString(){return`Layer(${t??`anonymous`})`}}),Je={succeed:(e,t)=>J(()=>Promise.resolve(F.make(e,t)),e.id),effect:(e,t)=>J(async()=>{let n=await t();return F.make(e,n)},e.id),sync:(e,t)=>J(()=>Promise.resolve(F.make(e,t())),e.id),fromService:(e,t,n)=>J(r=>{let i=r.unsafeGet(t);return Promise.resolve(F.make(e,n(i)))},e.id),fromServiceEffect:(e,t,n)=>J(async r=>{let i=await n(r.unsafeGet(t));return F.make(e,i)},e.id),fromContext:e=>J(()=>Promise.resolve(e)),empty:()=>J(()=>Promise.resolve(F.empty()),`empty`),mergeAll:(...e)=>J(async t=>(await Promise.all(e.map(e=>e.build(t)))).reduce((e,t)=>e.merge(t),F.empty()))},Ye=e=>({id:e,_tag:`Tag`,toString(){return`Tag(${e})`}}),Y=()=>{let e=0,t=[],n=async()=>{for(t.sort((e,t)=>e.time-t.time);t.length>0&&t[0]!==void 0&&t[0].time<=e;){let e=t.shift();e&&(e.resolve(),await Promise.resolve())}};return{get currentTime(){return e},async advance(t){e+=t,await n()},async setTime(t){e=t,await n()},async runAll(){if(t.length>0){let n=t[t.length-1];n&&(e=n.time)}await n()},get pendingCount(){return t.length},sleep(n){return new Promise(r=>{t.push({time:e+n,resolve:r})})}}},X=Ye(`TestClock`),Xe={make:Y,tag:X,test:async e=>e(Y()),get:q.service(X),advance:e=>q.serviceWithIO(X,t=>q.async(()=>t.advance(e))),setTime:e=>q.serviceWithIO(X,t=>q.async(()=>t.setTime(e))),runAll:q.serviceWithIO(X,e=>q.async(()=>e.runAll())),context:()=>{let e=Y();return{clock:e,context:F.make(X,e)}}},Ze={make:()=>{let e=Y(),t=F.empty(),n={get context(){return t},get clock(){return e},withService(e,r){return t=t.add(e,r),n},async run(e){return e.provideContext(t).runOrThrow()}};return n},withClock:()=>{let e=Y();return Ze.make().withService(X,e)}},Z=e=>{let t=!1,n,i,s=!1,d=()=>{if(!t)try{n=e(),t=!0}catch(e){throw i=e,s=!0,t=!0,e}if(s)throw i;return n};return{_tag:`Lazy`,get isEvaluated(){return t},orElse:e=>{try{return d()}catch{return e}},orNull:()=>{try{return d()}catch{return null}},orThrow:e=>{try{return d()}catch(t){throw e??t}},or:e=>Q(()=>{try{return d()}catch{return e.orThrow()}}),orUndefined:()=>{try{return d()}catch{return}},map:e=>Q(()=>e(d())),ap:e=>Q(()=>e.orThrow()(d())),mapAsync:async e=>{let t=await e(d());return Q(()=>t)},flatMap:e=>Q(()=>e(d()).orThrow()),flatMapAsync:async e=>{let t=await e(d());return Q(()=>t.orThrow())},filter:e=>Q(()=>{let t=d();return e(t)?a(t):r}),recover:e=>Q(()=>{try{return d()}catch(t){return e(t)}}),recoverWith:e=>Q(()=>{try{return d()}catch(t){return e(t).orThrow()}}),toOption:()=>{try{return a(d())}catch{return r}},toEither:()=>{try{return l(d())}catch(e){return c(e)}},toEitherWith:e=>{try{return l(d())}catch(t){return c(e(t))}},toTry:()=>o(()=>d()),tap:e=>Q(()=>{let t=d();return e(t),t}),tapError:e=>Q(()=>{try{return d()}catch(t){throw e(t),t}}),fold:e=>e(d()),foldWith:(e,t)=>{try{return t(d())}catch(t){return e(t)}},foldLeft:e=>t=>t(e,d()),foldRight:e=>t=>t(d(),e),match:e=>e.Lazy(d()),toString:()=>t&&!s?`Lazy(${u(n)})`:t&&s?`Lazy(<error: ${i instanceof Error?i.message:String(i)}>)`:`Lazy(<not evaluated>)`,toValue:()=>t&&!s?{_tag:`Lazy`,evaluated:!0,value:n}:{_tag:`Lazy`,evaluated:!1},get size(){try{return d(),1}catch{return 0}},get isEmpty(){try{return d(),!1}catch{return!0}},contains:e=>{try{return d()===e}catch{return!1}},reduce:e=>d(),reduceRight:e=>d(),count:e=>{try{return e(d())?1:0}catch{return 0}},find:e=>{try{let t=d();return e(t)?a(t):r}catch{return r}},exists:e=>{try{return e(d())}catch{return!1}},forEach:e=>{try{e(d())}catch{}},pipe:e=>e(d()),serialize:()=>({toJSON:()=>JSON.stringify(t&&!s?{_tag:`Lazy`,evaluated:!0,value:n}:{_tag:`Lazy`,evaluated:!1}),toYAML:()=>t&&!s?`_tag: Lazy\nevaluated: true\nvalue: ${u(n)}`:`_tag: Lazy
|
|
12
|
+
evaluated: false`,toBinary:()=>Buffer.from(JSON.stringify(t&&!s?{_tag:`Lazy`,evaluated:!0,value:n}:{_tag:`Lazy`,evaluated:!1})).toString(`base64`)}),typeable:`Lazy`}},Q=n(Z,{of:e=>Z(e),fromValue:e=>Z(()=>e),fromOption:(e,t)=>Z(()=>e._tag===`Some`?e.value:t()),fromTry:e=>Z(()=>e.orThrow()),fromEither:e=>Z(()=>e.fold(e=>{throw e},e=>e)),fromPromise:e=>Z(()=>{throw Error(`Promise not yet resolved. Use await on the promise before creating Lazy.`)}),fail:e=>Z(()=>{throw e})}),Qe=Map,$e={default:e=>t=>e(t),when:(e,t)=>n=>e(n)?t(n):void 0},$=(e=[])=>{let t=[...e],n=()=>t.length,r=()=>t.length===0;return{_tag:`Stack`,get size(){return n()},get isEmpty(){return r()},contains:e=>t.includes(e),reduce:e=>{if(t.length===0)throw Error(`Cannot reduce an empty stack`);return t.reduce(e)},reduceRight:e=>{if(t.length===0)throw Error(`Cannot reduce an empty stack`);return t.reduceRight(e)},push:e=>$([...t,e]),pop:()=>{if(r())return[$([]),i(null)];let e=[...t],n=e.pop();return[$(e),i(n)]},peek:()=>r()?i(null):i(t[t.length-1]),map:e=>$(t.map(e)),flatMap:e=>r()?$([]):t.reduce((t,n)=>e(n).toArray().reduce((e,t)=>e.push(t),t),$([])),ap:e=>{let n=[];return t.forEach(t=>{e.toArray().forEach(e=>{n.push(e(t))})}),$(n)},flatMapAsync:async e=>r()?$([]):(await Promise.all(t.map(async t=>await e(t)))).reduce((e,t)=>t.toArray().reduce((e,t)=>e.push(t),e),$([])),toList:()=>s(t),toArray:()=>[...t],toString:()=>`Stack(${t.join(`, `)})`,fold:(e,n)=>{if(r())return e();let i=t[t.length-1];return i===void 0?e():n(i)},foldLeft:e=>n=>t.reduce(n,e),foldRight:e=>n=>t.reduceRight((e,t)=>n(t,e),e),match:e=>r()?e.Empty():e.NonEmpty([...t]),toValue:()=>({_tag:`Stack`,value:t}),pipe:e=>e([...t]),serialize:()=>({toJSON:()=>JSON.stringify({_tag:`Stack`,value:t}),toYAML:()=>`_tag: Stack\nvalue: ${JSON.stringify(t)}`,toBinary:()=>Buffer.from(JSON.stringify({_tag:`Stack`,value:t})).toString(`base64`)})}},et=(e=[])=>$(e),tt={empty:()=>$([]),of:e=>$([e]),fromJSON:e=>nt(JSON.parse(e).value),fromYAML:e=>{let t=e.split(`
|
|
13
|
+
`)[1]?.split(`: `)[1];return nt(t?JSON.parse(t):[])},fromBinary:e=>{let t=Buffer.from(e,`base64`).toString();return tt.fromJSON(t)}},nt=n(et,tt);function rt(e){let t=ue({_tag:e._tag,impl:e.impl});return{...t,toValue:()=>({_tag:t._tag,value:e.value})}}export{f as $,Ae as A,be as B,Ie as C,S as D,x as E,De as F,he as G,ge as H,we as I,ve as J,fe as K,xe as L,b as M,v as N,w as O,ke as P,le as Q,Se as R,Le as S,Fe as T,pe as U,me as V,Ce as W,ue as X,h as Y,de as Z,N as _,Q as a,ne as at,Be as b,Ze as c,q as d,oe as et,V as f,Ge as g,F as h,Qe as i,ie as it,y as j,C as k,Ye as l,z as m,nt as n,ae as nt,Xe as o,re as ot,qe as p,ye as q,$e as r,ee as rt,X as s,d as st,rt as t,te as tt,Je as u,Ue as v,T as w,D as x,He as y,_e as z};
|
package/dist/branded/index.d.ts
CHANGED
|
@@ -1,2 +1,54 @@
|
|
|
1
|
-
|
|
1
|
+
//#region src/branded/Brand.d.ts
|
|
2
|
+
type Brand<K extends string, T> = T & {
|
|
3
|
+
readonly __brand: K;
|
|
4
|
+
};
|
|
5
|
+
type Unwrap<T> = T extends Brand<string, infer U> ? U : T;
|
|
6
|
+
type ExtractBrand<T> = T extends Brand<infer K, unknown> ? K : never;
|
|
7
|
+
/**
|
|
8
|
+
* Brand is a utility for creating nominal typing in TypeScript.
|
|
9
|
+
* It creates phantom types that exist only at compile time.
|
|
10
|
+
* At runtime, the branded value IS the primitive value.
|
|
11
|
+
*
|
|
12
|
+
* @param _brand
|
|
13
|
+
* @param value - The value to brand
|
|
14
|
+
* @returns The value with phantom type brand
|
|
15
|
+
*/
|
|
16
|
+
declare function Brand<K extends string, T>(_brand: K, value: T): Brand<K, T>;
|
|
17
|
+
/**
|
|
18
|
+
* Helper to unwrap a branded value to its underlying type
|
|
19
|
+
* Works with both Brand and ValidatedBrand
|
|
20
|
+
* @param branded - The branded value (can be null or undefined)
|
|
21
|
+
* @returns The original value without the brand
|
|
22
|
+
*
|
|
23
|
+
* Note: Also exported as 'unwrap' from 'functype/branded' for convenience
|
|
24
|
+
*/
|
|
25
|
+
declare function unwrapBrand<K extends string, T>(branded: Brand<K, T>): T;
|
|
26
|
+
declare function unwrapBrand<K extends string, T>(branded: Brand<K, T> | null): T | null;
|
|
27
|
+
declare function unwrapBrand<K extends string, T>(branded: Brand<K, T> | undefined): T | undefined;
|
|
28
|
+
declare function unwrapBrand<K extends string, T>(branded: Brand<K, T> | null | undefined): T | null | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Type guard for checking if a value has a specific brand
|
|
31
|
+
* @param value - The value to check
|
|
32
|
+
* @param _brand - The brand to check for (unused at runtime)
|
|
33
|
+
* @returns True if the value has the specified brand
|
|
34
|
+
*
|
|
35
|
+
* Note: Since brands are phantom types that exist only at compile time,
|
|
36
|
+
* this function can only provide a runtime approximation. It always returns true
|
|
37
|
+
* for non-null values, as we have no way to actually check the brand at runtime.
|
|
38
|
+
* This function is primarily for API consistency and documentation purposes.
|
|
39
|
+
*/
|
|
40
|
+
declare function hasBrand<K extends string, T>(value: unknown, _brand: K): value is Brand<K, T>;
|
|
41
|
+
/**
|
|
42
|
+
* Create a branded type constructor for a specific brand
|
|
43
|
+
* @param brand - The brand name
|
|
44
|
+
* @returns A function that brands values with the specified brand
|
|
45
|
+
*/
|
|
46
|
+
declare function createBrander<K extends string, T>(brand: K): (value: T) => Brand<K, T>;
|
|
47
|
+
type BrandedString<K extends string> = Brand<K, string>;
|
|
48
|
+
type BrandedNumber<K extends string> = Brand<K, number>;
|
|
49
|
+
type BrandedBoolean<K extends string> = Brand<K, boolean>;
|
|
50
|
+
declare const BrandedString: <K extends string>(brand: K) => (value: string) => BrandedString<K>;
|
|
51
|
+
declare const BrandedNumber: <K extends string>(brand: K) => (value: number) => BrandedNumber<K>;
|
|
52
|
+
declare const BrandedBoolean: <K extends string>(brand: K) => (value: boolean) => BrandedBoolean<K>;
|
|
53
|
+
//#endregion
|
|
2
54
|
export { Brand, BrandedBoolean, BrandedNumber, BrandedString, ExtractBrand, Unwrap, createBrander, hasBrand, unwrapBrand as unwrap, unwrapBrand };
|
package/dist/branded/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
function e(e,t){return t}function t(e){return e??e}function n(e,t){return e!=null}function r(t){return n=>e(t,n)}const i=t=>n=>e(t,n),a=t=>n=>e(t,n),o=t=>n=>e(t,n);export{e as Brand,o as BrandedBoolean,a as BrandedNumber,i as BrandedString,r as createBrander,n as hasBrand,t as unwrap,t as unwrapBrand};
|
package/dist/cli/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{
|
|
3
|
-
`)},c=(
|
|
2
|
+
import{P as e}from"../Valuable-B8h0iKI_.js";import{Option as t}from"../option/index.js";import{List as n}from"../list/index.js";const r=`0.46.0`,i={Option:{description:`Safe nullable handling - Some<T> or None`,interfaces:[`Functor`,`Monad`,`Foldable`,`Extractable`,`Matchable`,`Serializable`,`Traversable`],methods:{create:[`Option(v)`,`Option.none()`,`Some(v)`,`None()`],transform:[`.map(f)`,`.flatMap(f)`,`.filter(p)`,`.ap(ff)`],extract:[`.fold(n, s)`,`.orElse(d)`,`.orThrow()`,`.orNull()`,`.match({Some, None})`],check:[`.isSome`,`.isNone`,`.isDefined`,`.isEmpty`]}},Either:{description:`Error handling with Left (error) or Right (success)`,interfaces:[`Functor`,`Monad`,`Foldable`,`Traversable`,`PromiseLike`],methods:{create:[`Right(v)`,`Left(e)`,`Either.right(v)`,`Either.left(e)`],transform:[`.map(f)`,`.flatMap(f)`,`.mapLeft(f)`,`.swap()`],extract:[`.fold(l, r)`,`.orElse(d)`,`.orThrow()`,`.match({Left, Right})`],check:[`.isRight`,`.isLeft`]}},Try:{description:`Wrap operations that may throw - Success<T> or Failure`,interfaces:[`Functor`,`Monad`,`Foldable`,`Extractable`,`Matchable`,`Serializable`,`Traversable`],methods:{create:[`Try(() => expr)`,`Success(v)`,`Failure(e)`],transform:[`.map(f)`,`.flatMap(f)`,`.recover(f)`,`.recoverWith(f)`],extract:[`.fold(f, s)`,`.orElse(d)`,`.orThrow()`,`.toOption()`,`.toEither()`],check:[`.isSuccess`,`.isFailure`]}},List:{description:`Immutable array with functional operations`,interfaces:[`Functor`,`Monad`,`Foldable`,`Collection`,`Serializable`,`Traversable`],methods:{create:[`List([...])`,`List.of(...)`,`List.empty()`],transform:[`.map(f)`,`.flatMap(f)`,`.filter(p)`,`.take(n)`,`.takeWhile(p)`,`.takeRight(n)`,`.drop(n)`,`.dropWhile(p)`,`.concat(list)`,`.reverse()`,`.distinct()`,`.sorted()`,`.sortBy(f)`,`.zip(list)`,`.zipWithIndex()`,`.prepend(v)`,`.slice(s, e)`],extract:[`.fold(z, f)`,`.reduce(f)`,`.head`,`.headOption`,`.tail`,`.last`,`.lastOption`,`.init`,`.indexOf(v)`,`.toArray()`],check:[`.isEmpty`,`.nonEmpty`,`.size`,`.contains(v)`],other:[`.groupBy(f)`,`.partition(p)`,`.span(p)`]}},Set:{description:`Immutable set of unique values`,interfaces:[`Functor`,`Foldable`,`Collection`,`Serializable`,`Traversable`],methods:{create:[`Set([...])`,`Set.of(...)`,`Set.empty()`],transform:[`.map(f)`,`.filter(p)`,`.union(s)`,`.intersection(s)`,`.difference(s)`,`.add(v)`],extract:[`.fold(z, f)`,`.toArray()`],check:[`.has(v)`,`.isEmpty`,`.size`]}},Map:{description:`Immutable key-value store`,interfaces:[`SafeTraversable`,`Collection`,`Serializable`],methods:{create:[`Map([[k, v], ...])`,`Map.of([k, v], ...)`,`Map.empty()`],transform:[`.set(k, v)`,`.delete(k)`,`.map(f)`,`.filter(p)`,`.add(k, v)`],extract:[`.get(k)`,`.keys()`,`.values()`,`.entries()`,`.fold(z, f)`],check:[`.has(k)`,`.isEmpty`,`.size`]}},Lazy:{description:`Deferred computation with memoization`,interfaces:[`Functor`,`Monad`,`Foldable`,`Extractable`,`Serializable`,`Traversable`],methods:{create:[`Lazy(() => expr)`],transform:[`.map(f)`,`.flatMap(f)`],extract:[`.fold(n, s)`,`.orElse(d)`,`.orThrow()`,`.get()`],check:[`.isEvaluated`]}},LazyList:{description:`Lazy sequences for large/infinite data`,interfaces:[`Functor`,`Monad`,`Iterable`],methods:{create:[`LazyList.from(iter)`,`LazyList.range(start, end)`,`LazyList.infinite(f)`],transform:[`.map(f)`,`.filter(p)`,`.take(n)`,`.takeRight(n)`,`.drop(n)`,`.takeWhile(p)`,`.dropWhile(p)`,`.concat(ll)`,`.reverse()`,`.distinct()`,`.zip(ll)`,`.zipWithIndex()`],extract:[`.head`,`.headOption`,`.tail`,`.last`,`.lastOption`,`.init`,`.toArray()`],check:[`.isEmpty`]}},Task:{description:`Async operations with cancellation and progress`,interfaces:[],methods:{create:[`Task.of(v)`,`Task.from(promise)`,`Task.sync(f)`,`Task.async(f)`],transform:[`.map(f)`,`.flatMap(f)`,`.mapError(f)`],extract:[`.run()`,`.cancel()`],other:[`.onProgress(cb)`,`.onCancel(cb)`]}},IO:{description:`Lazy effect type with typed errors and dependency injection`,interfaces:[`Functor`,`Monad`,`Foldable`,`Matchable`],methods:{create:[`IO(() => v)`,`IO.succeed(v)`,`IO.fail(e)`,`IO.sync(f)`,`IO.async(f)`,`IO.tryPromise({try, catch})`,`IO.fromEither(e)`,`IO.fromOption(o)`,`IO.fromTry(t)`],transform:[`.map(f)`,`.flatMap(f)`,`.tap(f)`,`.mapError(f)`,`.recover(v)`,`.recoverWith(f)`],extract:[`.run()`,`.runOrThrow()`,`.runSync()`,`.runSyncOrThrow()`,`.runExit()`,`.runOption()`,`.runTry()`,`.fold(onErr, onOk)`,`.match({failure, success})`],check:[],other:[`.catchTag(tag, f)`,`.catchAll(f)`,`.retry(n)`,`.retryWithDelay(n, ms)`,`.timeout(ms)`,`.delay(ms)`,`.zip(io)`,`.pipe(f)`,`IO.all([...])`,`IO.race([...])`,`IO.bracket(acquire, use, release)`,`IO.gen(function*() {...})`,`IO.Do.bind().map()`,`IO.service(Tag)`,`.provideService(Tag, impl)`,`.provideLayer(layer)`]}},Cond:{description:`Conditional expression builder - replace if-else chains`,interfaces:[],methods:{create:[`Cond<T>()`],other:[`.case(pred, result)`,`.otherwise(result)`,`.eval()`]}},Match:{description:`Pattern matching - replace switch statements`,interfaces:[],methods:{create:[`Match(value)`],other:[`.case(pattern, result)`,`.when(pred, result)`,`.default(result)`,`.done()`]}},Brand:{description:`Nominal typing without runtime overhead`,interfaces:[],methods:{create:[`Brand<K, T>(value)`],extract:[`.unwrap()`,`.toString()`]}},ValidatedBrand:{description:`Branded types with runtime validation`,interfaces:[],methods:{create:[`ValidatedBrand(validator)`,`.of(v)`,`.from(v)`,`.unsafeOf(v)`],check:[`.is(v)`],other:[`.refine(validator)`]}},Tuple:{description:`Fixed-size typed array`,interfaces:[`Typeable`,`Valuable`,`Iterable`],methods:{create:[`Tuple([a, b, ...])`,`Tuple.of(a, b, ...)`],extract:[`.first`,`.second`,`.toArray()`],transform:[`.map(f)`]}},Stack:{description:`Immutable LIFO stack`,interfaces:[`Foldable`,`Collection`,`Serializable`,`Traversable`],methods:{create:[`Stack()`,`Stack.of(...)`],transform:[`.push(v)`,`.pop()`],extract:[`.peek()`,`.toArray()`],check:[`.isEmpty`,`.size`]}}},a={Functor:{description:`Transform contained values`,methods:[`.map<B>(f: A => B): Functor<B>`]},Applicative:{extends:`Functor`,description:`Apply wrapped functions`,methods:[`.ap<B>(ff: Applicative<A => B>): Applicative<B>`]},Monad:{extends:`Applicative`,description:`Chain operations returning wrapped values`,methods:[`.flatMap<B>(f: A => Monad<B>): Monad<B>`]},Foldable:{description:`Extract via pattern matching`,methods:[`.fold<B>(empty: () => B, f: A => B): B`,`.foldLeft<B>(z: B, op: (B, A) => B): B`,`.foldRight<B>(z: B, op: (A, B) => B): B`]},Extractable:{description:`Get contained value with fallback`,methods:[`.orElse(d: T): T`,`.orThrow(e?: Error): T`,`.orNull(): T | null`,`.orUndefined(): T | undefined`]},Matchable:{description:`Pattern match on type variants`,methods:[`.match<R>(patterns: Record<Tag, Handler>): R`]},Traversable:{description:`Iterate and check contents`,methods:[`.size: number`,`.isEmpty: boolean`,`.contains(v: A): boolean`,`.reduce<B>(f, init): B`]},Collection:{description:`Collection operations`,methods:[`.toArray(): A[]`,`.forEach(f: A => void): void`]},Serializable:{description:`Convert to string formats`,methods:[`.serialize().toJSON(): string`,`.serialize().toYAML(): string`]}},o={Core:[`Option`,`Either`,`Try`],Collection:[`List`,`Set`,`Map`,`LazyList`,`Tuple`,`Stack`],Effect:[`IO`,`Task`],Utility:[`Lazy`,`Cond`,`Match`,`Brand`,`ValidatedBrand`]},s=()=>{let e=n([`functype ${r} - Scala-inspired FP for TypeScript`,``]);return n(Object.entries(o)).foldLeft(e)((e,[r,a])=>{let o=e.add(r.toUpperCase());return n(a).foldLeft(o)((e,n)=>t(i[n]).fold(()=>e,t=>{let r=t.interfaces.length>0?` [${t.interfaces.join(`, `)}]`:``;return e.add(` ${n}${r}`).add(` ${t.description}`)})).add(``)}).concat(n([`Use: npx functype <Type> for details`,`Use: npx functype interfaces for interface reference`])).toArray().join(`
|
|
3
|
+
`)},c=(e,r)=>{let i=r.interfaces.length>0?` [${r.interfaces.join(`, `)}]`:``,a=n([`create`,`transform`,`extract`,`check`,`other`]),o=n([`${e}<T>${i}`,``,r.description,``]);return a.foldLeft(o)((e,i)=>t(r.methods[i]).filter(e=>e.length>0).fold(()=>e,t=>{let r=e.add(i.toUpperCase());return n(t).foldLeft(r)((e,t)=>e.add(` ${t}`)).add(``)})).toArray().join(`
|
|
4
4
|
`).trimEnd()},l=()=>{let e=n([`INTERFACES`,``]);return n(Object.entries(a)).foldLeft(e)((e,[t,r])=>{let i=r.extends?` extends ${r.extends}`:``,a=e.add(`${t}<A>${i}`).add(` ${r.description}`);return n(r.methods).foldLeft(a)((e,t)=>e.add(` ${t}`)).add(``)}).toArray().join(`
|
|
5
|
-
`).trimEnd()},u=e=>JSON.stringify(e,null,2),d=()=>({version:r,categories:o,types:i}),f=t
|
|
5
|
+
`).trimEnd()},u=e=>JSON.stringify(e,null,2),d=()=>({version:r,categories:o,types:i}),f=e=>t(i[e]).map(t=>({name:e,data:t})).or(n(Object.entries(i)).find(([t])=>t.toLowerCase()===e.toLowerCase()).map(([e,t])=>({name:e,data:t}))).orUndefined(),p=()=>Object.keys(i),m=()=>a,h={Option:`export interface Option<T extends Type> extends Functype<T, "Some" | "None">, Promisable<T>, Doable<T>, Reshapeable<T> {
|
|
6
6
|
/** The contained value (undefined for None) */
|
|
7
7
|
readonly value: T | undefined
|
|
8
8
|
/** Whether this Option contains no value */
|
|
@@ -254,6 +254,25 @@ import{Ct as e,W as t,ht as n}from"../src-Bl2PmAVK.js";const r=`0.45.0`,i={Optio
|
|
|
254
254
|
add: (item: A) => List<A>
|
|
255
255
|
get: (index: number) => Option<A>
|
|
256
256
|
concat: (other: List<A>) => List<A>
|
|
257
|
+
take: (n: number) => List<A>
|
|
258
|
+
takeWhile: (p: (a: A) => boolean) => List<A>
|
|
259
|
+
takeRight: (n: number) => List<A>
|
|
260
|
+
get last(): A | undefined
|
|
261
|
+
get lastOption(): Option<A>
|
|
262
|
+
get tail(): List<A>
|
|
263
|
+
get init(): List<A>
|
|
264
|
+
reverse: () => List<A>
|
|
265
|
+
indexOf: (value: A) => number
|
|
266
|
+
prepend: (item: A) => List<A>
|
|
267
|
+
distinct: () => List<A>
|
|
268
|
+
sorted: (compareFn?: (a: A, b: A) => number) => List<A>
|
|
269
|
+
sortBy: <B>(f: (a: A) => B, compareFn?: (a: B, b: B) => number) => List<A>
|
|
270
|
+
zip: <B>(other: List<B>) => List<[A, B]>
|
|
271
|
+
zipWithIndex: () => List<[A, number]>
|
|
272
|
+
groupBy: <K>(f: (a: A) => K) => globalThis.Map<K, List<A>>
|
|
273
|
+
partition: (p: (a: A) => boolean) => [List<A>, List<A>]
|
|
274
|
+
span: (p: (a: A) => boolean) => [List<A>, List<A>]
|
|
275
|
+
slice: (start: number, end: number) => List<A>
|
|
257
276
|
/**
|
|
258
277
|
* Pattern matches over the List, applying a handler function based on whether it's empty
|
|
259
278
|
* @param patterns - Object with handler functions for Empty and NonEmpty variants
|
|
@@ -470,6 +489,19 @@ import{Ct as e,W as t,ht as n}from"../src-Bl2PmAVK.js";const r=`0.45.0`,i={Optio
|
|
|
470
489
|
concat(other: LazyList<A>): LazyList<A>
|
|
471
490
|
zip<B extends Type>(other: LazyList<B>): LazyList<[A, B]>
|
|
472
491
|
|
|
492
|
+
takeRight(n: number): LazyList<A>
|
|
493
|
+
reverse(): LazyList<A>
|
|
494
|
+
distinct(): LazyList<A>
|
|
495
|
+
zipWithIndex(): LazyList<[A, number]>
|
|
496
|
+
|
|
497
|
+
// Element access (properties)
|
|
498
|
+
get head(): A | undefined
|
|
499
|
+
get headOption(): Option<A>
|
|
500
|
+
get last(): A | undefined
|
|
501
|
+
get lastOption(): Option<A>
|
|
502
|
+
get tail(): LazyList<A>
|
|
503
|
+
get init(): LazyList<A>
|
|
504
|
+
|
|
473
505
|
// Terminal operations (force evaluation)
|
|
474
506
|
toList(): List<A>
|
|
475
507
|
toArray(): A[]
|
|
@@ -479,8 +511,6 @@ import{Ct as e,W as t,ht as n}from"../src-Bl2PmAVK.js";const r=`0.45.0`,i={Optio
|
|
|
479
511
|
some(predicate: (a: A) => boolean): boolean
|
|
480
512
|
every(predicate: (a: A) => boolean): boolean
|
|
481
513
|
count(): number
|
|
482
|
-
first(): Option<A>
|
|
483
|
-
last(): Option<A>
|
|
484
514
|
|
|
485
515
|
// Additional methods for clarity
|
|
486
516
|
toString(): string
|
|
@@ -609,7 +639,7 @@ import{Ct as e,W as t,ht as n}from"../src-Bl2PmAVK.js";const r=`0.45.0`,i={Optio
|
|
|
609
639
|
* @returns The result of applying the matching handler function
|
|
610
640
|
*/
|
|
611
641
|
match<R>(patterns: { Empty: () => R; NonEmpty: (values: A[]) => R }): R
|
|
612
|
-
} & Traversable<A> &`},g=e=>{let t=n(e.slice(2));return{flags:{json:t.contains(`--json`),full:t.contains(`--full`),help:t.exists(e=>e===`--help`||e===`-h`)},args:t.filter(e=>!e.startsWith(`--`)&&e!==`-h`)}},_=t
|
|
642
|
+
} & Traversable<A> &`},g=e=>{let t=n(e.slice(2));return{flags:{json:t.contains(`--json`),full:t.contains(`--full`),help:t.exists(e=>e===`--help`||e===`-h`)},args:t.filter(e=>!e.startsWith(`--`)&&e!==`-h`)}},_=e=>t(h[e]).or(n(Object.entries(h)).find(([t])=>t.toLowerCase()===e.toLowerCase()).map(([,e])=>e)),v=()=>{let e=n([`FULL INTERFACE DEFINITIONS`,`=`.repeat(60),``]);return n(Object.entries(h)).foldLeft(e)((e,[t,r])=>e.concat(n([`// ${t}`,r,``,`-`.repeat(60),``]))).toArray().join(`
|
|
613
643
|
`).trimEnd()},y=()=>{console.log(`functype - API documentation for LLMs
|
|
614
644
|
|
|
615
645
|
USAGE
|
|
@@ -631,4 +661,4 @@ EXAMPLES
|
|
|
631
661
|
npx functype Option --json # Option as JSON
|
|
632
662
|
npx functype Option --full # Full TypeScript interface
|
|
633
663
|
npx functype --full # All full interfaces (large output!)
|
|
634
|
-
`)},b=e=>{console.error(`Unknown type: ${e}`),console.error(``),console.error(`Available types: ${p().join(`, `)}`),console.error(``),console.error(`Use: npx functype interfaces - for interface reference`),process.exit(1)},x=e=>console.log(e),S=(
|
|
664
|
+
`)},b=e=>{console.error(`Unknown type: ${e}`),console.error(``),console.error(`Available types: ${p().join(`, `)}`),console.error(``),console.error(`Use: npx functype interfaces - for interface reference`),process.exit(1)},x=e=>console.log(e),S=(e,n)=>t(f(e)).fold(()=>b(e),e=>{n.full?_(e.name).fold(()=>x(n.json?u({[e.name]:e.data}):c(e.name,e.data)),t=>x(n.json?u({[e.name]:{...e.data,fullInterface:t}}):t)):x(n.json?u({[e.name]:e.data}):c(e.name,e.data))});(()=>{let{flags:t,args:n}=g(process.argv);e(!0).when(()=>t.help,()=>y()).when(()=>n.isEmpty,()=>t.full?x(t.json?u(h):v()):x(t.json?u(d()):s())).when(()=>n.headOption.contains(`interfaces`),()=>x(t.json?u(m()):l())).default(()=>n.headOption.fold(()=>x(t.json?u(d()):s()),e=>S(e,t)))})();
|
package/dist/do/index.d.ts
CHANGED
|
@@ -1,2 +1,184 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { mn as Doable, nn as Reshapeable, pn as DoResult } from "../Functype-Dc440LS5.js";
|
|
2
|
+
import { Try } from "../try/index.js";
|
|
3
|
+
import { Option } from "../option/index.js";
|
|
4
|
+
import { List } from "../list/index.js";
|
|
5
|
+
import { Either } from "../either/index.js";
|
|
6
|
+
|
|
7
|
+
//#region src/do/index.d.ts
|
|
8
|
+
type OptionLike = {
|
|
9
|
+
_tag: "Some" | "None";
|
|
10
|
+
isSome(): boolean;
|
|
11
|
+
get(): unknown;
|
|
12
|
+
};
|
|
13
|
+
type EitherLike = {
|
|
14
|
+
_tag: "Left" | "Right";
|
|
15
|
+
isLeft(): boolean;
|
|
16
|
+
isRight(): boolean;
|
|
17
|
+
value: unknown;
|
|
18
|
+
};
|
|
19
|
+
type ListLike = {
|
|
20
|
+
_tag: "List";
|
|
21
|
+
toArray(): unknown[];
|
|
22
|
+
};
|
|
23
|
+
type TryLike = {
|
|
24
|
+
_tag: "Success" | "Failure";
|
|
25
|
+
isSuccess(): boolean;
|
|
26
|
+
get(): unknown;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Executes a generator-based monadic comprehension
|
|
30
|
+
* Returns the same monad type as the first yielded monad (Scala semantics)
|
|
31
|
+
*
|
|
32
|
+
* - Option comprehensions return Option (None on short-circuit)
|
|
33
|
+
* - Either comprehensions return Either (Left with error on short-circuit)
|
|
34
|
+
* - List comprehensions return List (empty or cartesian product)
|
|
35
|
+
* - Try comprehensions return Try (Failure with error on short-circuit)
|
|
36
|
+
*
|
|
37
|
+
* Type Inference Notes:
|
|
38
|
+
* - TypeScript infers the correct return type for homogeneous comprehensions
|
|
39
|
+
* - For mixed monad types, TypeScript returns a union type
|
|
40
|
+
* - Use DoTyped<T> or type assertions for mixed scenarios
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* // Option comprehension returns Option:
|
|
45
|
+
* const result = Do(function* () {
|
|
46
|
+
* const x = yield* $(Option(5));
|
|
47
|
+
* const y = yield* $(Option(10));
|
|
48
|
+
* return x + y;
|
|
49
|
+
* });
|
|
50
|
+
* // result: Option(15)
|
|
51
|
+
*
|
|
52
|
+
* // Either comprehension returns Either:
|
|
53
|
+
* const result = Do(function* () {
|
|
54
|
+
* const x = yield* $(Right(5));
|
|
55
|
+
* const y = yield* $(Left("error"));
|
|
56
|
+
* return x + y;
|
|
57
|
+
* });
|
|
58
|
+
* // result: Left("error") - error is preserved
|
|
59
|
+
*
|
|
60
|
+
* // List comprehension returns List with cartesian product:
|
|
61
|
+
* const result = Do(function* () {
|
|
62
|
+
* const x = yield* $(List([1, 2]));
|
|
63
|
+
* const y = yield* $(List([3, 4]));
|
|
64
|
+
* return x + y;
|
|
65
|
+
* });
|
|
66
|
+
* // result: List([4, 5, 5, 6])
|
|
67
|
+
*
|
|
68
|
+
* // Mixed types - use type assertion or DoTyped:
|
|
69
|
+
* const result = Do(function* () {
|
|
70
|
+
* const x = yield* $(Option(5));
|
|
71
|
+
* const y = yield* $(Right<string, number>(10));
|
|
72
|
+
* return x + y;
|
|
73
|
+
* }) as Option<number>;
|
|
74
|
+
* // result: Option(15)
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @param gen - Generator function that yields monads and returns a result
|
|
78
|
+
* @returns The same monad type as the first yield
|
|
79
|
+
*/
|
|
80
|
+
declare function Do<T>(gen: () => Generator<OptionLike, T, unknown>): Option<T>;
|
|
81
|
+
declare function Do<L, R>(gen: () => Generator<EitherLike, R, unknown>): Either<L, R>;
|
|
82
|
+
declare function Do<T>(gen: () => Generator<ListLike, T, unknown>): List<T>;
|
|
83
|
+
declare function Do<T>(gen: () => Generator<TryLike, T, unknown>): Try<T>;
|
|
84
|
+
declare function Do<T>(gen: () => Generator<OptionLike | EitherLike | ListLike | TryLike, T, unknown>): Reshapeable<T>;
|
|
85
|
+
declare function Do<T>(gen: () => Generator<unknown, T, unknown>): unknown;
|
|
86
|
+
/**
|
|
87
|
+
* Executes an async generator-based monadic comprehension
|
|
88
|
+
* Returns the same monad type as the first yielded monad
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* const result = await DoAsync(async function* () {
|
|
93
|
+
* const user = yield* $(await fetchUser(id)); // Promise<Option<User>> → User
|
|
94
|
+
* const profile = yield* $(await getProfile(user)); // Promise<Either<Error, Profile>> → Profile
|
|
95
|
+
* return { user, profile };
|
|
96
|
+
* });
|
|
97
|
+
* // result type matches first yield
|
|
98
|
+
* ```
|
|
99
|
+
*
|
|
100
|
+
* @param gen - Async generator function that yields monads/promises and returns a result
|
|
101
|
+
* @returns Promise of the same monad type as first yield
|
|
102
|
+
*/
|
|
103
|
+
declare function DoAsync<T>(gen: () => AsyncGenerator<OptionLike, T, unknown>): Promise<Option<T>>;
|
|
104
|
+
declare function DoAsync<L, R>(gen: () => AsyncGenerator<EitherLike, R, unknown>): Promise<Either<L, R>>;
|
|
105
|
+
declare function DoAsync<T>(gen: () => AsyncGenerator<ListLike, T, unknown>): Promise<List<T>>;
|
|
106
|
+
declare function DoAsync<T>(gen: () => AsyncGenerator<TryLike, T, unknown>): Promise<Try<T>>;
|
|
107
|
+
declare function DoAsync<T>(gen: () => AsyncGenerator<OptionLike | EitherLike | ListLike | TryLike, T, unknown>): Promise<Reshapeable<T>>;
|
|
108
|
+
declare function DoAsync<T>(gen: () => AsyncGenerator<unknown, T, unknown>): Promise<unknown>;
|
|
109
|
+
/**
|
|
110
|
+
* Helper function to check if a value implements the Doable interface
|
|
111
|
+
* @param value - Value to check
|
|
112
|
+
* @returns True if the value implements Doable
|
|
113
|
+
*/
|
|
114
|
+
declare function isDoCapable<T>(value: unknown): value is Doable<T>;
|
|
115
|
+
/**
|
|
116
|
+
* Manually unwrap a monad using the Doable interface
|
|
117
|
+
* Useful for testing or when you need to unwrap outside of a Do-comprehension
|
|
118
|
+
*
|
|
119
|
+
* @param monad - Monad to unwrap
|
|
120
|
+
* @returns The unwrapped value
|
|
121
|
+
* @throws Error if the monad cannot be unwrapped
|
|
122
|
+
*/
|
|
123
|
+
declare function unwrap<T>(monad: Doable<T>): T;
|
|
124
|
+
/**
|
|
125
|
+
* Type helper for Do-notation generators.
|
|
126
|
+
* Provides better type hints in IDEs.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* const result = Do(function* (): DoGenerator<number> {
|
|
131
|
+
* const x = yield* $(List([1, 2])) // x is still unknown but return type is clear
|
|
132
|
+
* const y = yield* $(List([3, 4]))
|
|
133
|
+
* return x + y
|
|
134
|
+
* })
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
type DoGenerator<T, TYield = unknown> = Generator<TYield, T, unknown>;
|
|
138
|
+
/**
|
|
139
|
+
* Extracts values from monads in Do-notation with type inference.
|
|
140
|
+
* The '$' symbol is the universal extraction operator in functional programming.
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* ```typescript
|
|
144
|
+
* const result = Do(function* () {
|
|
145
|
+
* const x = yield* $(Option(5)) // x: number
|
|
146
|
+
* const y = yield* $(List([1, 2, 3])) // y: number (for cartesian product)
|
|
147
|
+
* const name = yield* $(Right("Alice")) // name: string
|
|
148
|
+
* return `${name}: ${x + y}`
|
|
149
|
+
* })
|
|
150
|
+
* ```
|
|
151
|
+
*
|
|
152
|
+
* @param monad - Any monad that can be unwrapped (Option, Either, List, Try, etc.)
|
|
153
|
+
* @returns A generator that yields the monad and returns its extracted value
|
|
154
|
+
*/
|
|
155
|
+
declare function $<T>(monad: Option<T>): Generator<Option<T>, T, T>;
|
|
156
|
+
declare function $<L, R>(monad: Either<L, R>): Generator<Either<L, R>, R, R>;
|
|
157
|
+
declare function $<T>(monad: List<T>): Generator<List<T>, T, T>;
|
|
158
|
+
declare function $<T>(monad: Try<T>): Generator<Try<T>, T, T>;
|
|
159
|
+
declare function $<T>(monad: Doable<T>): Generator<Doable<T>, T, T>;
|
|
160
|
+
declare function $<M>(monad: M): Generator<M, InferYieldType<M>, InferYieldType<M>>;
|
|
161
|
+
type InferYieldType<M> = M extends {
|
|
162
|
+
isSome(): boolean;
|
|
163
|
+
get(): infer T;
|
|
164
|
+
} ? T : M extends {
|
|
165
|
+
isRight(): boolean;
|
|
166
|
+
value: infer R;
|
|
167
|
+
} ? R : M extends {
|
|
168
|
+
toArray(): (infer T)[];
|
|
169
|
+
} ? T : M extends {
|
|
170
|
+
isSuccess(): boolean;
|
|
171
|
+
get(): infer T;
|
|
172
|
+
} ? T : M extends Doable<infer T> ? T : unknown;
|
|
173
|
+
declare const NoneError: (message?: string) => Error;
|
|
174
|
+
interface LeftErrorType<L> extends Error {
|
|
175
|
+
value: L;
|
|
176
|
+
}
|
|
177
|
+
declare const LeftError: <L>(value: L, message?: string) => LeftErrorType<L>;
|
|
178
|
+
declare const EmptyListError: (message?: string) => Error;
|
|
179
|
+
interface FailureErrorType extends Error {
|
|
180
|
+
cause: Error;
|
|
181
|
+
}
|
|
182
|
+
declare const FailureError: (cause: Error, message?: string) => FailureErrorType;
|
|
183
|
+
//#endregion
|
|
184
|
+
export { $, Do, DoAsync, DoGenerator, type DoResult, type Doable, EmptyListError, FailureError, FailureErrorType, LeftError, LeftErrorType, NoneError, isDoCapable, unwrap };
|
package/dist/do/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Option as e}from"../option/index.js";import{Try as t}from"../try/index.js";import{List as n}from"../list/index.js";import{Left as r,Right as i}from"../either/index.js";function a(e){if(!e||typeof e!=`object`||!(`_tag`in e))return`unknown`;switch(e._tag){case`Some`:case`None`:return`Option`;case`Left`:case`Right`:return`Either`;case`List`:return`List`;case`Success`:case`Failure`:return`Try`;default:return`unknown`}}const o={Option:{of:t=>e(t),empty:()=>e.none()},Either:{of:e=>i(e),empty:e=>r(e)},List:{of:e=>n([e]),empty:()=>n([])},Try:{of:e=>t(()=>e),empty:e=>t(()=>{throw e??Error(`Try failed`)})}};function s(e){let t=e(),r=null,i;function s(l){let u=t.next(l);if(u.done)return i?i.of(u.value):n([u.value]);let d=u.value;if(typeof d!=`object`||!d)throw Error(`Do-notation error: All yielded values must be monadic. Use yield* $(Option(value)), yield* $(Right(value)), etc. Raw values should be assigned directly without yielding.`);if(!r&&`_tag`in d&&(r=a(d),r!==`unknown`&&r in o&&(i=o[r]),r===`List`))return c(e);if(`doUnwrap`in d){let e=d.doUnwrap();if(!e.ok){if(!i)return n([]);if(!e.empty&&`error`in e){if(r===`Either`)return i.empty(e.error);if(r===`Try`)return i.empty(e.error instanceof Error?e.error:Error(String(e.error)))}return i.empty()}return s(e.value)}throw Error(`Do-notation error: All yielded values must be monadic. Use yield* $(Option(value)), yield* $(Right(value)), etc. Raw values should be assigned directly without yielding.`)}return s()}function c(e){function t(e){if(typeof e!=`object`||!e||!(`doUnwrap`in e))return[e];let t=e;if(`toArray`in t){let e=t.toArray();return e.length===0?[]:e}let n=t.doUnwrap();return n.ok?[n.value]:[]}function r(n){let i=e(),a=[],o=[],s=0;function c(e){let l=i.next(e);if(l.done){a.push(l.value);return}if(s<n.length){let e=n[s];o.push(e),s++,c(e);return}let u=t(l.value);if(u.length!==0)if(u.length>1){let e=u.flatMap(e=>r([...o,e]));a.push(...e)}else o.push(u[0]),s++,c(u[0])}return c(void 0),a}return n(r([]))}async function l(e){let t=e(),r=null,i;async function s(e){let c=await t.next(e);if(c.done)return i?i.of(c.value):n([c.value]);let l=await Promise.resolve(c.value);if(typeof l!=`object`||!l)return s(l);if(!r&&`_tag`in l&&(r=a(l),r!==`unknown`&&r in o&&(i=o[r])),`doUnwrap`in l){let e=l.doUnwrap();if(!e.ok){if(!i)return n([]);if(!e.empty&&`error`in e){if(r===`Either`)return i.empty(e.error);if(r===`Try`)return i.empty(e.error instanceof Error?e.error:Error(String(e.error)))}return i.empty()}return s(e.value)}return s(l)}return s()}function u(e){return typeof e==`object`&&!!e&&`doUnwrap`in e&&typeof e.doUnwrap==`function`}function d(e){let t=e.doUnwrap();if(t.ok)return t.value;throw`error`in t?t.error:Error(`Cannot unwrap empty monad`)}function*f(e){return yield e}const p=(e=`Cannot unwrap None in Do-notation`)=>{let t=Error(e),n=Object.create(Error.prototype);return n.message=t.message,n.stack=t.stack,n.name=`NoneError`,n},m=(e,t=`Cannot unwrap Left in Do-notation`)=>{let n=Error(t),r=Object.create(Error.prototype);return r.message=n.message,r.stack=n.stack,r.name=`LeftError`,r.value=e,r},h=(e=`Cannot unwrap empty List in Do-notation`)=>{let t=Error(e),n=Object.create(Error.prototype);return n.message=t.message,n.stack=t.stack,n.name=`EmptyListError`,n},g=(e,t=`Cannot unwrap Failure in Do-notation`)=>{let n=Error(t),r=Object.create(Error.prototype);return r.message=n.message,r.stack=n.stack,r.name=`FailureError`,r.cause=e,r};export{f as $,s as Do,l as DoAsync,h as EmptyListError,g as FailureError,m as LeftError,p as NoneError,u as isDoCapable,d as unwrap};
|