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.
@@ -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
- //#region src/tuple/Tuple.d.ts
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};
@@ -1,2 +1,54 @@
1
- import { a as ExtractBrand, c as hasBrand, i as BrandedString, l as unwrapBrand, n as BrandedBoolean, o as Unwrap, r as BrandedNumber, s as createBrander, t as Brand } from "../Brand-B_uQBKwR.js";
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 };
@@ -1 +1 @@
1
- import{a as e,i as t,n,o as r,r as i,s as a,t as o}from"../Brand-DxglW-qB.js";export{o as Brand,n as BrandedBoolean,i as BrandedNumber,t as BrandedString,e as createBrander,r as hasBrand,a as unwrap,a as unwrapBrand};
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{Ct as e,W as t,ht as n}from"../src-Bl2PmAVK.js";const r=`0.45.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)`,`.drop(n)`,`.concat(list)`],extract:[`.fold(z, f)`,`.reduce(f)`,`.head`,`.tail`,`.toArray()`],check:[`.isEmpty`,`.nonEmpty`,`.size`,`.contains(v)`]}},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)`,`.drop(n)`,`.concat(ll)`],extract:[`.head`,`.tail`,`.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 t=n([`functype ${r} - Scala-inspired FP for TypeScript`,``]);return n(Object.entries(o)).foldLeft(t)((t,[r,a])=>{let o=t.add(r.toUpperCase());return n(a).foldLeft(o)((t,n)=>e(i[n]).fold(()=>t,e=>{let r=e.interfaces.length>0?` [${e.interfaces.join(`, `)}]`:``;return t.add(` ${n}${r}`).add(` ${e.description}`)})).add(``)}).concat(n([`Use: npx functype <Type> for details`,`Use: npx functype interfaces for interface reference`])).toArray().join(`
3
- `)},c=(t,r)=>{let i=r.interfaces.length>0?` [${r.interfaces.join(`, `)}]`:``,a=n([`create`,`transform`,`extract`,`check`,`other`]),o=n([`${t}<T>${i}`,``,r.description,``]);return a.foldLeft(o)((t,i)=>e(r.methods[i]).filter(e=>e.length>0).fold(()=>t,e=>{let r=t.add(i.toUpperCase());return n(e).foldLeft(r)((e,t)=>e.add(` ${t}`)).add(``)})).toArray().join(`
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=>e(i[t]).map(e=>({name:t,data:e})).or(n(Object.entries(i)).find(([e])=>e.toLowerCase()===t.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> {
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=>e(h[t]).or(n(Object.entries(h)).find(([e])=>e.toLowerCase()===t.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(`
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=(t,n)=>e(f(t)).fold(()=>b(t),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:e,args:n}=g(process.argv);t(!0).when(()=>e.help,()=>y()).when(()=>n.isEmpty,()=>e.full?x(e.json?u(h):v()):x(e.json?u(d()):s())).when(()=>n.headOption.contains(`interfaces`),()=>x(e.json?u(m()):l())).default(()=>n.headOption.fold(()=>x(e.json?u(d()):s()),t=>S(t,e)))})();
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)))})();
@@ -1,2 +1,184 @@
1
- import { Gn as Doable, Wn as DoResult, a as EmptyListError, c as LeftError, d as isDoCapable, f as unwrap, i as DoGenerator, l as LeftErrorType, n as Do, o as FailureError, r as DoAsync, s as FailureErrorType, t as $, u as NoneError } from "../index-DBg23xHh.js";
2
- export { $, Do, DoAsync, DoGenerator, DoResult, Doable, EmptyListError, FailureError, FailureErrorType, LeftError, LeftErrorType, NoneError, isDoCapable, unwrap };
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{A as e,D as t,F as n,M as r,N as i,O as a,P as o,j as s,k as c}from"../src-Bl2PmAVK.js";export{t as $,a as Do,c as DoAsync,e as EmptyListError,s as FailureError,r as LeftError,i as NoneError,o as isDoCapable,n as unwrap};
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};