functype 1.3.0 → 1.3.1
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-DiOMBHDG.js +1 -0
- package/dist/CompanionTypes-BVqO7Kc2.js +1 -0
- package/dist/CompanionTypes-CAxuM7qS.d.ts +58 -0
- package/dist/cli/exports.js +1 -1
- package/dist/cli/index.js +5 -5
- package/dist/companion/index.d.ts +2 -0
- package/dist/companion/index.js +1 -0
- package/dist/conditional/index.d.ts +2 -0
- package/dist/conditional/index.js +1 -0
- package/dist/core/task/index.d.ts +2 -0
- package/dist/core/task/index.js +1 -0
- package/dist/decoder/index.d.ts +2 -0
- package/dist/decoder/index.js +1 -0
- package/dist/do/index.d.ts +1 -1
- package/dist/do/index.js +1 -1
- package/dist/either/index.d.ts +1 -1
- package/dist/either/index.js +1 -1
- package/dist/fetch/index.d.ts +2 -0
- package/dist/fetch/index.js +1 -0
- package/dist/{full-interfaces-0pOr6idp.js → full-interfaces-BO3WRfCs.js} +1 -1
- package/dist/functype/index.d.ts +2 -0
- package/dist/functype/index.js +0 -0
- package/dist/{index-DBYBJg-D.d.ts → index-2qrljvxu.d.ts} +4832 -4889
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/io/index.d.ts +2 -0
- package/dist/io/index.js +1 -0
- package/dist/lazy/index.d.ts +2 -0
- package/dist/lazy/index.js +1 -0
- package/dist/list/index.d.ts +1 -1
- package/dist/list/index.js +1 -1
- package/dist/logger/index.d.ts +36 -1
- package/dist/map/index.d.ts +1 -1
- package/dist/map/index.js +1 -1
- package/dist/obj/index.d.ts +2 -0
- package/dist/obj/index.js +1 -0
- package/dist/option/index.d.ts +1 -1
- package/dist/option/index.js +1 -1
- package/dist/serialization/index.d.ts +2 -0
- package/dist/serialization/index.js +1 -0
- package/dist/serialization-EQGLX3e3.js +4 -0
- package/dist/set/index.d.ts +1 -1
- package/dist/set/index.js +1 -1
- package/dist/src-CVFuTCru.js +17 -0
- package/dist/try/index.d.ts +1 -1
- package/dist/try/index.js +1 -1
- package/dist/tuple/index.js +1 -1
- package/dist/typeclass/index.d.ts +2 -0
- package/dist/typeclass/index.js +1 -0
- package/dist/typeclass-C61yDVYd.js +1 -0
- package/dist/util/index.d.ts +24 -0
- package/dist/util/index.js +1 -0
- package/package.json +5 -4
- package/dist/Logger-75yEf2wp.d.ts +0 -32
- package/dist/Tuple-knEoDiKZ.js +0 -4
- package/dist/src-P2lgP6cJ.js +0 -17
- package/readme/BRAND_MIGRATION_GUIDE.md +0 -230
- package/readme/BUNDLE_OPTIMIZATION.md +0 -74
- package/readme/HKT.md +0 -110
- package/readme/ROADMAP.md +0 -113
- package/readme/TASK-TODO.md +0 -33
- package/readme/TUPLE-EXAMPLES.md +0 -76
- package/readme/ai-guide.md +0 -384
- package/readme/examples.md +0 -1883
- package/readme/quick-reference.md +0 -462
- package/readme/task-error-handling.md +0 -283
- package/readme/tasks.md +0 -195
- package/readme/type-index.md +0 -225
package/dist/src-P2lgP6cJ.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./chunk-DK3Fl9T5.js";import{Brand as t}from"./branded/index.js";import{a as n,f as r,m as i,n as a,o,p as s,t as c}from"./Tuple-knEoDiKZ.js";const l=e=>e instanceof Error?u(e):typeof e==`string`?e:r(e)??`<unserializable cause>`,u=e=>{if(e instanceof Error){let t={name:e.name,message:e.message};e.stack!==void 0&&(t.stack=e.stack);let{cause:n}=e;return n!==void 0&&(t.cause=l(n)),t}return{name:`NonErrorThrowable`,message:typeof e==`string`?e:r(e)??`<unserializable>`}},d=e=>{if(typeof e==`string`)return Error(e);let t=Error(e.message);if(e.name&&(t.name=e.name),e.stack!==void 0&&(t.stack=e.stack),e.cause!==void 0){let n=t;n.cause=d(e.cause)}return t},f=e=>({[Symbol.toStringTag]:`Option`,_tag:`Some`,value:e,isEmpty:!1,isSome(){return!0},isNone(){return!1},orElse:t=>e,orThrow:()=>e,expect:t=>e,or:t=>f(e),orNull:()=>e,orUndefined:()=>e,map:t=>f(t(e)),ap:t=>t._tag===`Some`&&t.value?f(t.value(e)):p,filter(t){return t(e)?f(e):p},count:t=>+!!t(e),find:t=>t(e)?f(e):p,exists:t=>t(e),forEach:t=>t(e),fold:(t,n)=>n(e),foldAsync:async(t,n)=>n(e),match:t=>t.Some(e),flatMap:t=>t(e),flatMapAsync:async t=>await t(e),reduce:t=>e,reduceRight:t=>e,foldLeft:t=>n=>n(t,e),foldRight:t=>n=>n(e,t),contains:t=>t===e,toList:()=>C([e]),size:1,toOption:()=>f(e),toEither:t=>w(e),toTry:()=>x(()=>e),toPromise:()=>Promise.resolve(e),toString:()=>`Some(${r(e)})`,toValue:()=>({_tag:`Some`,value:e}),toJSON:()=>({"@functype":`Option`,_tag:`Some`,value:e}),pipe:t=>t(e),serialize:()=>n(`Option`,`Some`,e),doUnwrap(){return{ok:!0,value:e}}}),p={[Symbol.toStringTag]:`Option`,_tag:`None`,value:void 0,isEmpty:!0,isSome(){return!1},isNone(){return!0},orElse:e=>e,orThrow(e){throw e??Error(`Cannot extract value from None`)},expect(e){return e()},or:e=>e,orNull:()=>null,orUndefined:()=>void 0,map:e=>p,ap:e=>p,filter(e){return p},count:e=>0,find:e=>p,exists:e=>!1,forEach:e=>{},flatMap:e=>p,flatMapAsync:e=>Promise.resolve(p),reduce:e=>{throw Error(`Cannot reduce an empty Option`)},reduceRight:e=>{throw Error(`Cannot reduceRight an empty Option`)},fold:(e,t)=>e(),foldAsync:async(e,t)=>e(),match:e=>e.None(),foldLeft:e=>()=>e,foldRight:e=>()=>e,contains:()=>!1,toList:()=>C([]),size:0,toOption:()=>p,toEither:e=>T(e),toTry:()=>x(()=>{throw Error(`None`)}),toPromise:()=>Promise.reject(Error(`Cannot convert None to Promise`)),toString:()=>`None`,toValue:()=>({_tag:`None`,value:void 0}),toJSON:()=>({"@functype":`Option`,_tag:`None`,value:null}),pipe:e=>e(void 0),serialize:()=>n(`Option`,`None`,null),doUnwrap(){return{ok:!1,empty:!0}}},m=()=>p,ee=e=>e==null?m():f(e),te={from:e=>h(e),none:()=>m(),isSome:e=>e.isSome(),isNone:e=>e.isNone(),fromJSON:e=>{let t=JSON.parse(e);if(t[`@functype`]!==void 0&&t[`@functype`]!==`Option`)throw Error(`Option.fromJSON: expected @functype="Option", got ${JSON.stringify(t[`@functype`])}`);return t._tag===`Some`?f(t.value):m()},fromYAML:e=>{let t=e.split(`
|
|
2
|
-
`),n=t[0]?.split(`: `)[1],r=t[1]?.split(`: `)[1];if(!n||!r)return m();let i=r===`null`?null:JSON.parse(r);return n===`Some`?f(i):m()},fromBinary:e=>{let t=Buffer.from(e,`base64`).toString();return te.fromJSON(t)},sequence:e=>e.reduce((e,t)=>e.isEmpty||t.isEmpty?m():f([...e.value,t.value]),f([])),traverse:(e,t)=>e.reduce((e,n,r)=>e.flatMap(e=>t(n,r).map(t=>[...e,t])),f([]))},h=s(ee,te),ne=(e,t)=>e.reduce(t),re=(e,t)=>e.reduceRight(t),g=globalThis.Set,_=e=>{let t=new g(e),r={[Symbol.toStringTag]:`FunctypeSet`,_tag:`Set`,[Symbol.iterator]:()=>t[Symbol.iterator](),add:e=>_([...t,e]),remove:e=>{let n=new g(t);return n.delete(e),_(n)},contains:e=>t.has(e),has:e=>t.has(e),map:e=>_(Array.from(t).map(e)),ap:e=>{let n=new g;for(let r of t)for(let t of e)n.add(t(r));return _(n)},flatMap:e=>{let n=new g;for(let r of t)for(let t of e(r))n.add(t);return _(n)},flatMapAsync:async e=>{let n=new g;for(let r of t){let t=await e(r);for(let e of t)n.add(e)}return _(n)},fold:(e,n)=>{let r=e;for(let e of t)r=n(r,e);return r},foldLeft:e=>n=>{let r=e;for(let e of t)r=n(r,e);return r},foldRight:e=>n=>Array.from(t).reduceRight((e,t)=>n(t,e),e),get size(){return t.size},get isEmpty(){return t.size===0},reduce:e=>{let n=Array.from(t);if(n.length===0)throw Error(`Cannot reduce empty Set`);return ne(n,e)},reduceRight:e=>{let n=Array.from(t);if(n.length===0)throw Error(`Cannot reduceRight empty Set`);return re(n,e)},count:e=>{let n=0;for(let r of t)e(r)&&n++;return n},find:e=>{for(let n of t)if(e(n))return h(n);return h(null)},exists:e=>{for(let n of t)if(e(n))return!0;return!1},forEach:e=>{t.forEach(e)},filter:e=>{let n=new g;for(let r of t)e(r)&&n.add(r);return _(n)},filterNot:e=>{let n=new g;for(let r of t)e(r)||n.add(r);return _(n)},drop:e=>_(Array.from(t).slice(e)),dropRight:e=>_(Array.from(t).slice(0,-e)),dropWhile:e=>{let n=Array.from(t),r=n.findIndex(t=>!e(t));return _(r===-1?[]:n.slice(r))},flatten:()=>{let e=new g;for(let n of t)if(Array.isArray(n))for(let t of n)e.add(t);else if(n&&typeof n==`object`&&Symbol.iterator in n)for(let t of n)e.add(t);else e.add(n);return _(e)},get head(){return Array.from(t)[0]},get headOption(){let e=Array.from(t)[0];return h(e)},take:e=>_(Array.from(t).slice(0,Math.max(0,e))),takeWhile:e=>{let n=Array.from(t),r=[];for(let t of n){if(!e(t))break;r.push(t)}return _(r)},takeRight:e=>{let n=Array.from(t);return _(e<=0?[]:n.slice(-e))},get last(){let e=Array.from(t);return e[e.length-1]},get lastOption(){let e=Array.from(t);return h(e[e.length-1])},get tail(){return _(Array.from(t).slice(1))},get init(){let e=Array.from(t);return _(e.length===0?[]:e.slice(0,-1))},toList:()=>C(Array.from(t)),toSet:()=>r,toArray:()=>Array.from(t),toString:()=>`Set(${Array.from(t).toString()})`,toValue:()=>({_tag:`Set`,value:Array.from(t)}),toJSON:()=>({"@functype":`Set`,_tag:`Set`,value:Array.from(t)}),pipe:e=>e(Array.from(t)),serialize:()=>n(`Set`,Array.from(t))};return r},ie=e=>_(e),ae=_([]),oe={empty:()=>ae,of:(...e)=>_(e),fromJSON:e=>{let t=JSON.parse(e);if(t[`@functype`]!==void 0&&t[`@functype`]!==`Set`)throw Error(`Set.fromJSON: expected @functype="Set", got ${JSON.stringify(t[`@functype`])}`);return se(t.value)},fromYAML:e=>{let t=e.split(`
|
|
3
|
-
`)[1]?.split(`: `)[1];return se(t?JSON.parse(t):[])},fromBinary:e=>{let t=Buffer.from(e,`base64`).toString();return oe.fromJSON(t)}},se=s(ie,oe),ce=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}}},v=s(ce,{of:e=>ce(e)}),le=(e=0)=>{let t=v(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)}},ue=()=>{let e=v([]);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}},y=e=>{let t={[Symbol.toStringTag]:`LazyList`,_tag:`LazyList`,[Symbol.iterator]:()=>e[Symbol.iterator](),map:t=>y((function*(){for(let n of e)yield t(n)})()),flatMap:t=>y((function*(){for(let n of e)yield*t(n)})()),filter:t=>y((function*(){for(let n of e)t(n)&&(yield n)})()),take:t=>y((function*(){let n=le(0);for(let r of e){if(n.get()>=t)break;yield r,n.increment()}})()),drop:t=>y((function*(){let n=le(0);for(let r of e)n.get()>=t&&(yield r),n.increment()})()),takeWhile:t=>y((function*(){for(let n of e){if(!t(n))break;yield n}})()),dropWhile:t=>y((function*(){let n=v(!0);for(let r of e)n.get()&&t(r)||(n.set(!1),yield r)})()),concat:t=>y((function*(){yield*e,yield*t})()),zip:t=>y((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:()=>C(Array.from(e)),toArray:()=>Array.from(e),forEach:t=>{for(let n of e)t(n)},reduce:(t,n)=>{let r=v(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 h(n);return h.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=le(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?h.none():h(t.value)},get last(){let t;for(let n of e)t=n;return t},get lastOption(){let t=v(void 0),n=v(!1);for(let r of e)t.set(r),n.set(!0);return n.get()?h(t.get()):h.none()},get tail(){return y((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 y(t.length===0?[]:t.slice(0,-1))},takeRight:t=>{let n=Array.from(e);return y(t<=0?[]:n.slice(-t))},reverse:()=>y(Array.from(e).reverse()),distinct:()=>y((function*(){let t=new globalThis.Set;for(let n of e)t.has(n)||(t.add(n),yield n)})()),zipWithIndex:()=>y((function*(){let t=le(0);for(let n of e)yield[n,t.get()],t.increment()})()),fold:(t,n)=>{let r=t;for(let t of e)r=n(r,t);return r},foldLeft:t=>n=>{let r=v(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:()=>n(`LazyList`,Array.from(e)),toJSON:()=>({"@functype":`LazyList`,_tag:`LazyList`,value:Array.from(e)}),toString:()=>{let t=[],n=le(0),r=v(!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},de=s(e=>y(e),{empty:()=>y([]),of:e=>y([e]),from:(...e)=>y(e),fromJSON:e=>{let t=JSON.parse(e);if(t[`@functype`]!==void 0&&t[`@functype`]!==`LazyList`)throw Error(`LazyList.fromJSON: expected @functype="LazyList", got ${JSON.stringify(t[`@functype`])}`);return y(t.value)},iterate:(e,t)=>y((function*(){let n=v(e);for(;;)yield n.get(),n.set(t(n.get()))})()),generate:e=>y((function*(){for(;;)yield e()})()),range:(e,t,n=1)=>y((function*(){if(n===0)throw Error(`Step cannot be zero`);let r=v(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)=>y((function*(){if(t===void 0)for(;;)yield e;else{let n=le(0);for(;n.get()<t;)yield e,n.increment()}})()),cycle:e=>y((function*(){let t=Array.from(e);if(t.length!==0)for(;;)yield*t})())}),fe=e=>({[Symbol.toStringTag]:`Try`,_tag:`Success`,error:void 0,isSuccess(){return!0},isFailure(){return!1},orElse:t=>e,orThrow:t=>e,expect:t=>e,or:t=>fe(e),orNull:()=>e,orUndefined:()=>e,toEither:t=>w(e),map:t=>x(()=>t(e)),ap:t=>t.map(t=>t(e)),flatMap:t=>t(e),flatMapAsync:async t=>t(e),fold:(t,n)=>n(e),foldAsync:async(t,n)=>n(e),match:t=>t.Success(e),recover:t=>fe(e),recoverWith:t=>fe(e),foldLeft:t=>n=>n(t,e),foldRight:t=>n=>n(e,t),toString:()=>`Success(${r(e)})`,toPromise:()=>Promise.resolve(e),toValue:()=>({_tag:`Success`,value:e}),toJSON:()=>({"@functype":`Try`,_tag:`Success`,value:e}),toOption:()=>f(e),toList:()=>C([e]),toTry:()=>fe(e),pipe:t=>t(e),serialize:()=>n(`Try`,`Success`,e),contains:t=>e===t,exists:t=>t(e),forEach:t=>t(e),doUnwrap(){return{ok:!0,value:e}}}),b=e=>({[Symbol.toStringTag]:`Try`,_tag:`Failure`,error:e,isSuccess(){return!1},isFailure(){return!0},orElse:e=>e,orThrow:t=>{throw t??e},expect:t=>t(e),or:e=>e,orNull:()=>null,orUndefined:()=>void 0,toEither:t=>T(typeof t==`function`?t(e):t),map:t=>b(e),ap:t=>b(e),flatMap:t=>b(e),flatMapAsync:t=>Promise.resolve(b(e)),fold:(t,n)=>t(e),foldAsync:async(t,n)=>t(e),match:t=>t.Failure(e),recover:t=>x(()=>t(e)),recoverWith:t=>{try{return t(e)}catch(e){return b(e instanceof Error?e:Error(String(e)))}},foldLeft:e=>t=>e,foldRight:e=>t=>e,toString:()=>`Failure(${r(e)}))`,toPromise:()=>Promise.reject(e),toValue:()=>({_tag:`Failure`,value:e}),toJSON:()=>({"@functype":`Try`,_tag:`Failure`,error:u(e)}),toOption:()=>h(null),toList:()=>C([]),toTry:()=>b(e),pipe:t=>{throw e},serialize:()=>o(`Try`,`Failure`,{error:u(e)}),contains:e=>!1,exists:e=>!1,forEach:e=>{},doUnwrap(){return{ok:!1,empty:!1,error:e}}}),pe=e=>{try{return fe(e())}catch(e){return b(e instanceof Error?e:Error(String(e)))}},me={success:e=>fe(e),failure:e=>b(typeof e==`string`?Error(e):e),fromPromise:e=>e.then(e=>fe(e)).catch(e=>b(e instanceof Error?e:Error(String(e)))),isSuccess:e=>e.isSuccess(),isFailure:e=>e.isFailure(),fromJSON:e=>{let t=JSON.parse(e);if(t[`@functype`]!==void 0&&t[`@functype`]!==`Try`)throw Error(`Try.fromJSON: expected @functype="Try", got ${JSON.stringify(t[`@functype`])}`);if(t._tag===`Success`)return fe(t.value);if(t.error!==void 0&&typeof t.error==`object`)return b(d(t.error));let n=Error(typeof t.error==`string`?t.error:``);return t.stack&&(n.stack=t.stack),b(n)},fromYAML:e=>{let t=e.split(`
|
|
4
|
-
`),n=t[0]?.split(`: `)[1];if(!n)return b(Error(`Invalid YAML format for Try`));if(n===`Success`){let e=t[1]?.split(`: `)[1];return e?fe(JSON.parse(e)):b(Error(`Invalid YAML format for Try Success`))}else{let e=t[1]?.split(`: `)[1];if(!e)return b(Error(`Invalid YAML format for Try Failure`));let n=t[2]?.split(`: `),r=n&&n.length>1?n.slice(1).join(`: `):void 0,i=Error(e);return r&&(i.stack=r),b(i)}},fromBinary:e=>{let t=Buffer.from(e,`base64`).toString();return me.fromJSON(t)},sequence:e=>x(()=>e.map(e=>e.orThrow())),traverse:(e,t)=>x(()=>e.map((e,n)=>t(e,n).orThrow()))},x=s(pe,me);function he({_tag:e,impl:t}){return{...t,_tag:e}}function ge(e,t){return!e||typeof e!=`object`||!(`_tag`in e)?!1:t?e._tag===t:!0}const S=e=>{let t=Array.from(e??[]),i={[Symbol.toStringTag]:`List`,_tag:`List`,[Symbol.iterator]:()=>t[Symbol.iterator](),get size(){return t.length},get length(){return t.length},map:e=>S(t.map(e)),ap:e=>S(t.flatMap(t=>Array.from(e).map(e=>e(t)))),flatMap:e=>S(t.flatMap(t=>Array.from(e(t)))),flatMapAsync:async e=>S((await Promise.all(t.map(async t=>await e(t)))).flatMap(e=>Array.from(e))),forEach:e=>t.forEach(e),contains:e=>t.includes(e),count:e=>t.filter(e).length,exists:e=>t.some(e),filter:e=>S(t.filter(e)),filterNot:e=>S(t.filter(t=>!e(t))),filterType:e=>S(t.filter(t=>ge(t,e))),find:(e,n)=>h(t.find(t=>e(t)&&(n?ge(t,n):!0))),get head(){return t[0]},get headOption(){return t.length>0?h(t[0]):m()},get isEmpty(){return t.length===0},toArray:()=>[...t],reduce:e=>ne(t,e),reduceRight:e=>re(t,e),fold:(e,n)=>t.reduce(n,e),foldLeft:e=>n=>t.reduce(n,e),foldRight:e=>n=>t.reduceRight((e,t)=>n(t,e),e),match:e=>t.length===0?e.Empty():e.NonEmpty([...t]),remove:e=>S(t.filter(t=>t!==e)),removeAt:e=>e<0||e>=t.length?i:S([...t.slice(0,e),...t.slice(e+1)]),add:e=>S([...t,e]),get:e=>h(t[e]),concat:e=>S([...t,...e.toArray()]),take:e=>S(t.slice(0,Math.max(0,e))),takeWhile:e=>{let n=[];for(let r of t){if(!e(r))break;n.push(r)}return S(n)},takeRight:e=>S(e<=0?[]:t.slice(-e)),get last(){return t[t.length-1]},get lastOption(){return t.length>0?h(t[t.length-1]):m()},get tail(){return S(t.slice(1))},get init(){return S(t.length===0?[]:t.slice(0,-1))},reverse:()=>S([...t].reverse()),indexOf:e=>t.indexOf(e),prepend:e=>S([e,...t]),distinct:()=>{let e=new globalThis.Set,n=[];for(let r of t)e.has(r)||(e.add(r),n.push(r));return S(n)},sorted:e=>S([...t].sort(e)),sortBy:(e,n)=>S([...t].sort((t,r)=>{let i=e(t),a=e(r);return n?n(i,a):i<a?-1:+(i>a)})),zip:e=>{let n=e.toArray(),r=Math.min(t.length,n.length),i=[];for(let e=0;e<r;e++)i.push([t[e],n[e]]);return S(i)},zipWithIndex:()=>S(t.map((e,t)=>[e,t])),groupBy:e=>{let n=new globalThis.Map;for(let r of t){let t=e(r),i=n.get(t)??[];i.push(r),n.set(t,i)}let r=new globalThis.Map;for(let[e,t]of n)r.set(e,S(t));return r},partition:e=>{let n=[],r=[];for(let i of t)e(i)?n.push(i):r.push(i);return[S(n),S(r)]},span:e=>{let n=t.findIndex(t=>!e(t));return n===-1?[S([...t]),S([])]:[S(t.slice(0,n)),S(t.slice(n))]},slice:(e,n)=>S(t.slice(e,n)),drop:e=>S(t.slice(e)),dropRight:e=>S(t.slice(0,-e)),dropWhile:e=>S(t.slice(t.findIndex(t=>!e(t)))),flatten:()=>S(t.flatMap(e=>Array.isArray(e)?e:[e])),toList:()=>i,toSet:()=>se(t),toOption:()=>t.length>0?h(t[0]):m(),toEither:e=>t.length>0?w(t[0]):T(e),toTry:()=>t.length>0?x(()=>t[0]):x(()=>{throw Error(`Empty list`)}),toString:()=>`List(${r(t)})`,toValue:()=>({_tag:`List`,value:t}),toJSON:()=>({"@functype":`List`,_tag:`List`,value:[...t]}),pipe:e=>e([...t]),serialize:()=>n(`List`,t),doUnwrap(){return t.length===0?{ok:!1,empty:!0}:{ok:!0,value:t[0]}}};return i},_e=e=>S(e),ve=S([]),ye={empty:()=>ve,of:(...e)=>S(e),fromJSON:e=>{let t=JSON.parse(e);if(t[`@functype`]!==void 0&&t[`@functype`]!==`List`)throw Error(`List.fromJSON: expected @functype="List", got ${JSON.stringify(t[`@functype`])}`);return C(t.value)},fromYAML:e=>{let t=e.split(`
|
|
5
|
-
`)[1]?.split(`: `)[1];return C(t?JSON.parse(t):[])},fromBinary:e=>{let t=Buffer.from(e,`base64`).toString();return ye.fromJSON(t)}},C=s(_e,ye),be=e=>({[Symbol.toStringTag]:`Either`,_tag:`Right`,value:e,isLeft(){return!1},isRight(){return!0},orElse:t=>e,orThrow:()=>e,expect:t=>e,or:t=>w(e),orNull:()=>e,orUndefined:()=>e,map:t=>w(t(e)),ap:t=>t._tag===`Right`?w(t.value(e)):T(t.value),mapAsync:t=>t(e).then(e=>w(e)).catch(e=>Promise.resolve(T(e))),merge:t=>t.isLeft()?T(t.value):w([e,t.value]),flatMap:t=>t(e),flatMapAsync:t=>t(e).catch(e=>T(e)),toOption:()=>f(e),toList:()=>C([e]),toEither:t=>w(e),toTry:()=>x(()=>e),toJSON(){return{"@functype":`Either`,_tag:`Right`,value:e}},toString:()=>`Right(${r(e)})`,*[Symbol.iterator](){yield e},*yield(){yield e},traverse:t=>{let n=t(e);return n.isLeft()?T(n.value):w([n.value])},tap:t=>(t(e),w(e)),tapLeft:t=>w(e),mapLeft:t=>w(e),bimap:(t,n)=>w(n(e)),fold:(t,n)=>n(e),foldAsync:async(t,n)=>n(e),foldLeft:t=>n=>n(t,e),foldRight:t=>n=>n(e,t),match:t=>t.Right(e),swap:()=>T(e),toPromise:()=>Promise.resolve(e),toValue:()=>({_tag:`Right`,value:e}),pipeEither:(t,n)=>n(e),pipe:t=>t(e),serialize:()=>n(`Either`,`Right`,e),contains:t=>e===t,exists:t=>t(e),forEach:t=>t(e),doUnwrap(){return{ok:!0,value:e}}}),xe=e=>({[Symbol.toStringTag]:`Either`,_tag:`Left`,value:e,isLeft(){return!0},isRight(){return!1},orElse:e=>e,orThrow:t=>{throw t??e},expect:t=>t(e),or:e=>e,orNull:()=>null,orUndefined:()=>void 0,map:t=>T(e),ap:t=>T(e),mapAsync:t=>Promise.resolve(T(e)),merge:t=>T(e),flatMap:t=>T(e),flatMapAsync:t=>Promise.resolve(T(e)),toOption:()=>m(),toList:()=>C(),toEither:e=>T(e),toTry:()=>x(()=>{throw Error(String(e))}),toJSON(){return{"@functype":`Either`,_tag:`Left`,value:e}},toString:()=>`Left(${r(e)})`,*[Symbol.iterator](){},*yield(){},traverse:t=>T(e),tap:t=>T(e),tapLeft:t=>(t(e),T(e)),mapLeft:t=>T(t(e)),bimap:(t,n)=>T(t(e)),fold:(t,n)=>t(e),foldAsync:async(t,n)=>t(e),foldLeft:e=>t=>e,foldRight:e=>t=>e,match:t=>t.Left(e),swap:()=>w(e),toPromise:()=>Promise.reject(e),toValue:()=>({_tag:`Left`,value:e}),pipeEither:(t,n)=>t(e),pipe:t=>t(e),serialize:()=>n(`Either`,`Left`,e),contains:e=>!1,exists:e=>!1,forEach:e=>{},doUnwrap(){return{ok:!1,empty:!1,error:e}}}),w=e=>be(e),T=e=>xe(e),Se=e=>e.isRight(),Ce=e=>e.isLeft(),we=(e,t)=>{try{return w(e())}catch(e){return T(t(e))}},Te=e=>be(e);console.assert(Te);const Ee=e=>xe(e);console.assert(Ee);const De=async(e,t)=>{try{return w(await e())}catch(e){return T(t(e))}},Oe=(e,t)=>t?w(e):T(e),ke={left:e=>T(e),right:e=>w(e),void:()=>w(void 0),isRight:e=>e.isRight(),isLeft:e=>e.isLeft(),sequence:e=>e.reduce((e,t)=>e.isLeft()?e:t.isLeft()?T(t.value):e.map(e=>[...e,t.value]),w([])),traverse:(e,t)=>ke.sequence(e.map(t)),fromNullable:(e,t)=>e==null?T(t):w(e),fromPredicate:(e,t,n)=>t(e)?w(e):T(n),ap:(e,t)=>e.flatMap(e=>t.map(e)),fromPromise:async(e,t)=>{try{return w(await e)}catch(e){return T(t(e))}},fromJSON:e=>{let t=JSON.parse(e);if(t[`@functype`]!==void 0&&t[`@functype`]!==`Either`)throw Error(`Either.fromJSON: expected @functype="Either", got ${JSON.stringify(t[`@functype`])}`);return t._tag===`Right`?w(t.value):T(t.value)},fromYAML:e=>{let t=e.split(`
|
|
6
|
-
`),n=t[0]?.split(`: `)[1],r=t[1]?.split(`: `)[1];if(!n||!r)throw Error(`Invalid YAML format for Either`);let i=JSON.parse(r);return n===`Right`?w(i):T(i)},fromBinary:e=>{let t=Buffer.from(e,`base64`).toString();return ke.fromJSON(t)}},Ae=s(Oe,ke);function E(e,n){return{brand:e,validate:n,of:r=>n(r)?h(t(e,r)):h.none(),from:r=>n(r)?w(t(e,r)):T(`Invalid ${e}: validation failed`),unsafeOf:r=>{if(!n(r))throw Error(`Invalid ${e}: validation failed`);return t(e,r)},is:e=>{try{return n(e)}catch{return!1}},unwrap:e=>e,refine:(e,t)=>E(e,e=>n(e)&&t(e))}}const je=E(`PositiveNumber`,e=>e>0),Me=E(`NonNegativeNumber`,e=>e>=0),Ne=E(`IntegerNumber`,e=>Number.isInteger(e)),Pe=je.refine(`PositiveInteger`,e=>Number.isInteger(e)),Fe=E(`NonEmptyString`,e=>e.length>0),Ie=E(`EmailAddress`,e=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)),Le=E(`UrlString`,e=>{try{return new URL(e),!0}catch{return!1}}),Re=E(`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)),ze=E(`ISO8601Date`,e=>!isNaN(Date.parse(e))&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(e));function Be(e,t,n){return E(e,e=>e>=t&&e<=n)}function Ve(e,t,n){return E(e,e=>e.length>=t&&e.length<=n)}function He(e,t){return E(e,e=>t.test(e))}const Ue=e=>typeof e==`function`&&Object.keys(e).length>0,We=e=>{let t=e=>typeof e==`function`?e():e,n={when:(r,i)=>e.resolved?n:r?We({resolved:!0,value:t(i)}):n,elseWhen:(r,i)=>e.resolved?n:r?We({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},Ge=()=>We({resolved:!1}),Ke=s(Ge,{of:()=>Ge(),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}}),qe=(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 qe(r,n)}):!1,D=e=>{let t=(e,t)=>typeof e==`function`?e(t):e,n=()=>{for(let{pattern:n,result:r}of e.patterns)if(qe(e.value,n))return{matched:!0,result:t(r,e.value)};return{matched:!1}},r={case:(n,i)=>e.resolved?r:qe(e.value,n)?D({value:e.value,resolved:!0,result:t(i,e.value),patterns:[]}):D({...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 D({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 D({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(qe(e.value,r))return D({value:e.value,resolved:!0,result:t(i,e.value),patterns:[]});return D({...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 h(e.result);let t=n();return t.matched?h(t.result):h.none()}};return r},Je=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 qe(e,n)?D({...i,resolved:!0,result:t(r,e)}):D(i)},caseValue:(t,n)=>D(e===t?{value:e,resolved:!0,result:typeof n==`function`?n():n,patterns:[]}:{value:e,resolved:!1,patterns:[]}),caseValues:(t,n)=>t.includes(e)?D({value:e,resolved:!0,result:typeof n==`function`?n():n,patterns:[]}):D({value:e,resolved:!1,patterns:[]}),when:(n,r)=>{let i={value:e,resolved:!1,patterns:[{pattern:n,result:r}]};return n(e)?D({...i,resolved:!0,result:t(r,e)}):D(i)},caseAny:(n,r)=>{for(let i of n)if(qe(e,i))return D({value:e,resolved:!0,result:t(r,e),patterns:n.map(e=>({pattern:e,result:r}))});return D({value:e,resolved:!1,patterns:n.map(e=>({pattern:e,result:r}))})}}},Ye=s(e=>Je(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(qe(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(qe(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 Xe(e,t){return{...he({_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 Ze=`Throwable`;var Qe=class e extends Error{constructor(e,t){super(e,{cause:t?.cause}),this._tag=Ze,this.name=t?.taskInfo?.name??`Throwable`,Object.defineProperties(this,{_tag:{value:Ze,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??`Throwable`,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 $e(e){return e instanceof Error&&typeof e==`object`&&e._tag===`Throwable`}const et=(e,t)=>{if(e.isRight())return k(e.orThrow(),t);if(e.isLeft())return O(e.fold(e=>e,()=>Error(`Unexpected right value`)),void 0,t);throw Error(`Unrecognized task outcome`)},O=(e,t,n)=>{let r={name:n?.name??`Task`,description:n?.description??``},i=Qe.apply(e,t,r),a={...Xe(`Err`,{error:i,meta:r}),[Symbol.toStringTag]:`TaskOutcome`,_tag:`Err`,_meta:r,value:void 0,error:i,isSuccess(){return!1},isFailure(){return!0},isOk(){return!1},isErr(){return!0},map:e=>O(i,t,n),flatMap:e=>O(i,t,n),ap:e=>O(i,t,n),mapAsync:e=>Promise.resolve(O(i,t,n)),flatMapAsync:e=>Promise.resolve(O(i,t,n)),mapError:e=>O(e(i),t,n),recover:e=>k(e,n),recoverWith:e=>k(e(i),n),orThrow:e=>{throw e??i},orElse:e=>e,or:e=>e,orNull:()=>null,orUndefined:()=>void 0,toEither:()=>T(i),toTry:()=>x(()=>{throw i}),toOption:()=>m(),toList:()=>C([]),fold:(e,t)=>e(i),match:e=>e.Err(i),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=>m(),exists:e=>!1,forEach:e=>{},toPromise:()=>Promise.reject(i),doUnwrap(){return{ok:!1,empty:!1,error:i}},toJSON:()=>({"@functype":`Task`,_tag:`Err`,error:u(i)}),serialize:()=>o(`Task`,`Err`,{error:u(i)}),pipe:e=>e(a)};return a},k=(e,t)=>{let r={name:t?.name??`Task`,description:t?.description??``},i={...Xe(`Ok`,{value:e,meta:r}),[Symbol.toStringTag]:`TaskOutcome`,_tag:`Ok`,_meta:r,value:e,error:void 0,isSuccess(){return!0},isFailure(){return!1},isOk(){return!0},isErr(){return!1},map:n=>k(n(e),t),flatMap:n=>{let r=n(e);return r&&typeof r==`object`&&`isLeft`in r&&`isRight`in r?et(r,t):r},ap:n=>n.isOk()?k(n.value(e),t):O(n.error,void 0,t),mapAsync:async n=>k(await n(e),t),flatMapAsync:async t=>await t(e),mapError:n=>k(e,t),recover:n=>k(e,t),recoverWith:n=>k(e,t),orThrow:t=>e,orElse:t=>e,or:n=>k(e,t),orNull:()=>e,orUndefined:()=>e,toEither:()=>w(e),toTry:()=>x(()=>e),toOption:()=>f(e),toList:()=>C([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),find:t=>t(e)?f(e):m(),exists:t=>t(e),forEach:t=>t(e),toPromise:()=>Promise.resolve(e),doUnwrap(){return{ok:!0,value:e}},toJSON:()=>({"@functype":`Task`,_tag:`Ok`,value:e}),serialize:()=>n(`Task`,`Ok`,e),pipe:e=>e(i)};return i},tt=()=>{let e=new AbortController,t=ue();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)}}))}}},nt=e=>{let t=e?.name??`Task`,n=e?.description??``,r={Async:(e,r=e=>e,i=()=>{},a)=>new Promise(o=>{(async()=>{let s=v(!1),c=v(null),l=v(()=>{});if(a){if(a.isCancelled){try{await i()}catch(e){o(O(e,void 0,{name:t,description:n}));return}o(O(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(O(e,void 0,{name:t,description:n}));return}if(s.get()){c.get()?o(O(c.get(),void 0,{name:t,description:n})):o(O(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(k(r,{name:t,description:n}))}else o(k(r,{name:t,description:n}))}catch(e){try{await i()}catch(e){o(O(e,void 0,{name:t,description:n}));return}if(s.get()){c.get()?o(O(c.get(),void 0,{name:t,description:n})):o(O(Error(`Task was cancelled during execution`),void 0,{name:t,description:n}));return}try{if(e instanceof Error&&$e(e)){let i=Error(`${t}: ${e.message}`),a=Qe.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(O(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(O(i,void 0,{name:t,description:n}))}else o(O(i,void 0,{name:t,description:n}))}}catch(e){o(O(e,void 0,{name:t,description:n}))}}finally{l.get()()}})().catch(e=>o(O(e,void 0,{name:t,description:n})))}),Sync:(e,r=e=>e,i=()=>{})=>{try{return k(e(),{name:t,description:n})}catch(e){return O(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{...Xe(`Task`,r),_type:`Task`}},rt={success:(e,t)=>k(e,t),fail:(e,t,n)=>O(e,t,n),ok:(e,t)=>k(e,t),err:(e,t,n)=>O(e,t,n),fromJSON:e=>{let t=JSON.parse(e);if(t[`@functype`]!==void 0&&t[`@functype`]!==`Task`)throw Error(`Task.fromJSON: expected @functype="Task", got ${JSON.stringify(t[`@functype`])}`);if(t._tag===`Ok`)return k(t.value);if(t._tag===`Err`)return O(t.error!==void 0&&typeof t.error==`object`?d(t.error):Error(typeof t.error==`string`?t.error:`Unknown Task error`));throw Error(`Task.fromJSON: unrecognized _tag ${JSON.stringify(t._tag)}`)},fromEither:(e,t)=>et(e,t),fromTry:(e,t)=>e.isSuccess()?k(e.orThrow(),t):O(e.fold(e=>e,()=>Error(`Unexpected success`)),void 0,t),getErrorChain:e=>{if(!e)return[];let t=ue();t.add(e);let n=v(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=rt.getErrorChain(e),r=t?.separator??`
|
|
7
|
-
`;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=v(`${n>0?`↳ `:``}${i}${a}`);return t?.includeStackTrace&&e.stack&&o.set(`${o.get()}\n${e.stack.split(`
|
|
8
|
-
`).slice(1).join(`
|
|
9
|
-
`)}`),o.get()}).join(r)},fromPromise:(e,t)=>(...n)=>A(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)=>A({name:n?.name??`TaskRace`,description:n?.description??`Race between multiple tasks`}).Async(async()=>{let n=ue();e.forEach(e=>n.add(e));let r=v(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)=>A(n).Async(()=>new Promise((n,r)=>{try{e(...t,(e,t)=>{e?r(e):n(t)})}catch(e){r(e)}}),e=>e)},createCancellationTokenSource:tt,cancellable:(e,t)=>{let n=tt();return{task:A(t).Async(()=>e(n.token),e=>e,()=>{},n.token),cancel:()=>n.cancel()}},withProgress:(e,t=()=>{},n)=>{let r=tt(),i=v(0),a=e=>{i.set(Math.max(0,Math.min(100,e))),t(i.get())};return{task:A(n).Async(()=>e(a,r.token),e=>e,()=>{},r.token),cancel:()=>r.cancel(),currentProgress:()=>i.get()}}},A=s(nt,rt),it=Map,j=e=>{let t={values:new it(e)},r=()=>Array.from(t.values.entries()).map(([e,t])=>c([e,t])),i=e=>j(new it(t.values).set(e.toArray()[0],e.toArray()[1]).entries()),a=e=>{let n=new it(t.values);return n.delete(e)?j(n.entries()):j(t.values.entries())},o=e=>{if(!e||typeof e.toArray!=`function`)return!1;let n=e.toArray();return t.values.get(n[0])===n[1]},s=()=>t.values.size,l=e=>j(Array.from(t.values.entries()).map(([t,n])=>[t,e(n)])),u=e=>j(j(t.values.entries()).toList().flatMap(e).toArray()),d=e=>{let n=[];for(let[r,i]of t.values.entries()){let t=e.get(r);t._tag===`Some`&&t.value&&n.push([r,t.value(i)])}return j(n)},f=async e=>{let n=new it;for(let[r,i]of t.values.entries()){let t=await e(i);for(let e of t.toList()){let[t,r]=e.toArray();n.set(t,r)}}return j(n.entries())},p=e=>C(r()).reduce(e),m=e=>C(r()).reduceRight(e),ee=e=>t=>C(r()).foldLeft(e)(t),te=e=>t=>C(r()).foldRight(e)(t),ne=e=>h(t.values.get(e)),re=(e,n)=>h(t.values.get(e)).orElse(n),g=()=>t.values.size===0,_=(e,n)=>h(t.values.get(e)).or(n),ie=(e,t)=>C(r()).fold(e,t),ae=()=>C(r()),oe=()=>se(r()),ce=()=>`Map(${r().toString()})`,v=e=>g()?e.Empty():e.NonEmpty(r());return{[Symbol.toStringTag]:`FunctypeMap`,_tag:`Map`,[Symbol.iterator]:()=>t.values.entries(),add:i,remove:a,contains:o,get size(){return s()},map:l,ap:d,flatMap:u,flatMapAsync:f,reduce:p,reduceRight:m,foldLeft:ee,foldRight:te,fold:ie,match:v,get:ne,getOrElse:re,get isEmpty(){return g()},orElse:_,toList:ae,toSet:oe,toString:ce,toValue:()=>({_tag:`Map`,value:Array.from(t.values.entries())}),toJSON:()=>({"@functype":`Map`,_tag:`Map`,value:Array.from(t.values.entries())}),pipe:e=>e(Array.from(t.values.entries())),serialize:()=>n(`Map`,Array.from(t.values.entries()))}},at=e=>j(e),ot=j([]),st={empty:()=>ot,of:(...e)=>j(e),fromJSON:e=>{let t=JSON.parse(e);if(t[`@functype`]!==void 0&&t[`@functype`]!==`Map`)throw Error(`Map.fromJSON: expected @functype="Map", got ${JSON.stringify(t[`@functype`])}`);return ct(t.value)},fromYAML:e=>{let t=e.split(`
|
|
10
|
-
`)[1]?.split(`: `)[1];return ct(t?JSON.parse(t):[])},fromBinary:e=>{let t=Buffer.from(e,`base64`).toString();return st.fromJSON(t)}},ct=s(at,st),lt=(e,t,n)=>({_tag:`Leaf`,path:e,message:t,cause:n}),ut=(e,t)=>({_tag:`Composite`,path:e,children:t}),dt=e=>e._tag===`Leaf`,ft=e=>e._tag===`Composite`,pt=(e,t)=>e._tag===`Leaf`?t.Leaf(e):t.Composite(e),mt=(e,t)=>t._tag===`Leaf`?{...t,path:[e,...t.path]}:{...t,children:C(t.children.toArray().map(t=>mt(e,t)))},ht=e=>e._tag===`Leaf`?C([{path:e.path,message:e.message}]):C(e.children.toArray().flatMap(e=>ht(e).toArray())),gt=e=>ht(e).toArray().map(({path:e,message:t})=>`${_t(e)}: ${t}`).join(`
|
|
11
|
-
`),_t=e=>e.length===0?`(root)`:e.reduce((e,t)=>t.startsWith(`[`)&&t.endsWith(`]`)?`${e}${t}`:e===``?t:`${e}.${t}`,``),M=s({},{leaf:lt,composite:ut,isLeaf:dt,isComposite:ft,match:pt,prepend:mt,flatten:ht,format:gt}),vt=e=>typeof e==`string`?w(e):T(M.leaf([],`expected string`,{received:e})),yt=e=>typeof e==`number`?w(e):T(M.leaf([],`expected number`,{received:e})),bt=e=>typeof e==`boolean`?w(e):T(M.leaf([],`expected boolean`,{received:e})),xt=e=>w(e),St=e=>t=>t==null?w(null):e(t),Ct=e=>t=>t==null?w(m()):e(t).fold(e=>T(e),e=>w(f(e))),wt={envelope:e=>t=>{if(typeof t!=`object`||!t)return T(M.leaf([],`expected envelope object {ok|err}`,{received:t}));let n=t;return`ok`in n?e.ok(n.ok).fold(e=>T(M.prepend(`ok`,e)),e=>w(w(e))):`err`in n?e.err(n.err).fold(e=>T(M.prepend(`err`,e)),e=>w(T(e))):T(M.leaf([],`expected envelope to have 'ok' or 'err' key`,{received:t}))},discriminated:(e,t,n)=>r=>{if(typeof r!=`object`||!r)return T(M.leaf([],`expected object with '${e.tag}' tag`,{received:r}));let i=r[e.tag];return i===e.rightTag?n(r).fold(e=>T(e),e=>w(w(e))):i===e.leftTag?t(r).fold(e=>T(e),e=>w(T(e))):T(M.leaf([],`expected '${e.tag}' to be '${e.rightTag}' or '${e.leftTag}'`,{received:i}))}},Tt=e=>t=>{if(!Array.isArray(t))return T(M.leaf([],`expected array`,{received:t}));let n=[],r=[];return t.forEach((t,i)=>{e(t).fold(e=>{n.push(M.prepend(`[${i}]`,e))},e=>{r.push(e)})}),kt(n,()=>C(r))},Et=e=>t=>{if(!Array.isArray(t))return T(M.leaf([],`expected array`,{received:t}));let n=[],r=[];return t.forEach((t,i)=>{e(t).fold(e=>{n.push(M.prepend(`[${i}]`,e))},e=>{r.push(e)})}),kt(n,()=>r)},Dt=e=>t=>{if(typeof t!=`object`||!t||Array.isArray(t))return T(M.leaf([],`expected object (for Map)`,{received:t}));let n=t,r=[],i=[];for(let t of Object.keys(n))e(n[t]).fold(e=>{r.push(M.prepend(t,e))},e=>{i.push([t,e])});return kt(r,()=>ct(i))},Ot=e=>t=>{if(typeof t!=`object`||!t||Array.isArray(t))return T(M.leaf([],`expected object`,{received:t}));let n=t,r=[],i={};for(let t in e)e[t](n[t]).fold(e=>{r.push(M.prepend(t,e))},e=>{i[t]=e});return kt(r,()=>i)},kt=(e,t)=>e.length===0?w(t()):e.length===1?T(e[0]):T(M.composite([],C(e))),At={string:vt,number:yt,boolean:bt,unknown:xt,nullable:St,option:Ct,either:wt,list:Tt,array:Et,map:Dt,object:Ot},jt=(e,t)=>M.prepend(e,t),Mt=(e,t,n)=>M.prepend(e,M.prepend(`[${t}]`,n)),Nt={option:e=>t=>{if(typeof t!=`object`||!t)return T(M.leaf([],`expected tagged Option object`,{received:t}));let n=t;return n._tag===`None`?w(m()):n._tag===`Some`?e(n.value).fold(e=>T(jt(`value`,e)),e=>w(f(e))):T(M.leaf([`_tag`],`expected 'Some' or 'None'`,{received:n._tag}))},either:(e,t)=>n=>{if(typeof n!=`object`||!n)return T(M.leaf([],`expected tagged Either object`,{received:n}));let r=n;return r._tag===`Right`?t(r.value).fold(e=>T(jt(`value`,e)),e=>w(w(e))):r._tag===`Left`?e(r.value).fold(e=>T(jt(`value`,e)),e=>w(T(e))):T(M.leaf([`_tag`],`expected 'Left' or 'Right'`,{received:r._tag}))},try:e=>t=>{if(typeof t!=`object`||!t)return T(M.leaf([],`expected tagged Try object`,{received:t}));let n=t;if(n._tag===`Success`)return e(n.value).fold(e=>T(jt(`value`,e)),e=>w(x.success(e)));if(n._tag===`Failure`){let e=typeof n.error==`string`?n.error:`unknown error`,t=Error(e);return typeof n.stack==`string`&&(t.stack=n.stack),w(x.failure(t))}return T(M.leaf([`_tag`],`expected 'Success' or 'Failure'`,{received:n._tag}))},list:e=>t=>{if(typeof t!=`object`||!t)return T(M.leaf([],`expected tagged List object`,{received:t}));let n=t;if(n._tag!==`List`)return T(M.leaf([`_tag`],`expected 'List'`,{received:n._tag}));if(!Array.isArray(n.value))return T(M.leaf([`value`],`expected array`,{received:n.value}));let r=[],i=[];return n.value.forEach((t,n)=>{e(t).fold(e=>{r.push(Mt(`value`,n,e))},e=>{i.push(e)})}),r.length===0?w(C(i)):r.length===1?T(r[0]):T(M.composite([],C(r)))},map:e=>t=>{if(typeof t!=`object`||!t)return T(M.leaf([],`expected tagged Map object`,{received:t}));let n=t;if(n._tag!==`Map`)return T(M.leaf([`_tag`],`expected 'Map'`,{received:n._tag}));if(!Array.isArray(n.value))return T(M.leaf([`value`],`expected entries array`,{received:n.value}));let r=[],i=[];return n.value.forEach((t,n)=>{if(!Array.isArray(t)||t.length!==2){r.push(M.leaf([`value`,`[${n}]`],`expected [key, value] tuple`,{received:t}));return}let[a,o]=t;if(typeof a!=`string`){r.push(M.leaf([`value`,`[${n}]`,`[0]`],`expected string key`,{received:a}));return}e(o).fold(e=>{r.push(M.prepend(`value`,M.prepend(`[${n}]`,M.prepend(`[1]`,e))))},e=>{i.push([a,e])})}),r.length===0?w(ct(i)):r.length===1?T(r[0]):T(M.composite([],C(r)))},obj:e=>t=>{if(typeof t!=`object`||!t)return T(M.leaf([],`expected tagged Obj object`,{received:t}));let n=t;if(n._tag!==`Obj`)return T(M.leaf([`_tag`],`expected 'Obj'`,{received:n._tag}));if(typeof n.value!=`object`||n.value===null)return T(M.leaf([`value`],`expected object`,{received:n.value}));let r=n.value,i=[],a={};for(let t in e)e[t](r[t]).fold(e=>{i.push(M.prepend(`value`,M.prepend(t,e)))},e=>{a[t]=e});return i.length===0?w(a):i.length===1?T(i[0]):T(M.composite([],C(i)))}},Pt=s({},{...At,tagged:Nt});function Ft(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 It={Option:{of:e=>h(e),empty:()=>h.none()},Either:{of:e=>w(e),empty:e=>T(e)},List:{of:e=>C([e]),empty:()=>C([])},Try:{of:e=>x(()=>e),empty:e=>x(()=>{throw e??Error(`Try failed`)})}};function Lt(e){let t=e(),n=null,r;function i(a){let o=t.next(a);if(o.done)return r?r.of(o.value):C([o.value]);let s=o.value;if(typeof s!=`object`||!s)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(!n&&`_tag`in s&&(n=Ft(s),n!==`unknown`&&n in It&&(r=It[n]),n===`List`))return Rt(e);if(`doUnwrap`in s){let e=s.doUnwrap();if(!e.ok){if(!r)return C([]);if(!e.empty&&`error`in e){if(n===`Either`)return r.empty(e.error);if(n===`Try`)return r.empty(e.error instanceof Error?e.error:Error(String(e.error)))}return r.empty()}return i(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 i()}function Rt(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 n(r){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<r.length){let e=r[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=>n([...o,e]));a.push(...e)}else o.push(u[0]),s++,c(u[0])}return c(void 0),a}return C(n([]))}async function zt(e){let t=e(),n=null,r;async function i(e){let a=await t.next(e);if(a.done)return r?r.of(a.value):C([a.value]);let o=await Promise.resolve(a.value);if(typeof o!=`object`||!o)return i(o);if(!n&&`_tag`in o&&(n=Ft(o),n!==`unknown`&&n in It&&(r=It[n])),`doUnwrap`in o){let e=o.doUnwrap();if(!e.ok){if(!r)return C([]);if(!e.empty&&`error`in e){if(n===`Either`)return r.empty(e.error);if(n===`Try`)return r.empty(e.error instanceof Error?e.error:Error(String(e.error)))}return r.empty()}return i(e.value)}return i(o)}return i()}function Bt(e){return typeof e==`object`&&!!e&&`doUnwrap`in e&&typeof e.doUnwrap==`function`}function Vt(e){let t=e.doUnwrap();if(t.ok)return t.value;throw`error`in t?t.error:Error(`Cannot unwrap empty monad`)}function*Ht(e){return yield e}const Ut=(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},Wt=(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},Gt=(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},Kt=(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},qt={includeTasks:!0,includeStackTrace:!1,separator:`
|
|
12
|
-
`,includeData:!1,maxStackFrames:3,title:`Error`,colors:!1};function Jt(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`?Yt(n):n},2)}function Yt(e){if(e===void 0||e===``)return``;let t=e.split(`
|
|
13
|
-
`);return[t[0],...t.slice(1).map(e=>e.trim())].join(`
|
|
14
|
-
`)}function Xt(e,t){let n={...qt,...t},r=e instanceof Error?e:Qe.apply(e),i=A?.getErrorChain?A.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=Yt(e.stack).split(`
|
|
15
|
-
`).slice(1),i=n.maxStackFrames??qt.maxStackFrames??3,a=t.slice(0,i).map(e=>`${r} ${n.colors?`\x1B[90m`:``}${e}${n.colors?`\x1B[0m`:``}`).join(`
|
|
16
|
-
`);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${Jt(e)}`:`\n\nContext:\n${Jt(e)}`;a+=t}}return a}function Zt(){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?Yt(t.stack):void 0};if(t.taskInfo&&(n.taskInfo=t.taskInfo),t.data&&(n.data=t.data),typeof A?.getErrorChain==`function`)try{let e=A.getErrorChain(t);e.length>1&&(n.errorChain=A.formatErrorChain(t,{includeTasks:!0}),n.structuredErrorChain=e.map(e=>({message:e.message,name:e.name,taskInfo:e.taskInfo,stack:e.stack?Yt(e.stack):void 0})))}catch{}return Object.getOwnPropertyNames(t).forEach(e=>{n[e]||(n[e]=t[e])}),n}}const Qt=e=>{let t=Error(e);return t.name=`ParseError`,t},N=(e,t,n,r)=>i(Qe.apply(t,n,{name:e,description:t}),{code:e,message:t,status:$t(e),context:n,timestamp:new Date().toISOString(),traceId:r?.traceId}),$t=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],P=Object.assign(N,{validation:(e,t,n)=>N(`VALIDATION_FAILED`,`Validation failed: ${e} ${n}`,{field:e,value:t,rule:n}),network:(e,t,n)=>N(`NETWORK_ERROR`,`Network error: ${t} ${e}${n?` (${n})`:``}`,{url:e,method:t,statusCode:n}),auth:(e,t)=>N(`AUTH_REQUIRED`,`Authentication required: ${e}${t?` (role: ${t})`:``}`,{resource:e,requiredRole:t}),notFound:(e,t)=>N(`NOT_FOUND`,`Not found: ${e} with id ${t}`,{resource:e,id:t}),permission:(e,t,n)=>N(`PERMISSION_DENIED`,`Permission denied: cannot ${e} ${t}`,{action:e,resource:t,userId:n}),rateLimit:(e,t,n)=>N(`RATE_LIMITED`,`Rate limit exceeded: ${e} requests per ${t}`,{limit:e,window:t,retryAfter:n}),internal:e=>N(`INTERNAL_ERROR`,`Internal server error: ${e}`,{errorId:e,timestamp:new Date().toISOString()}),badRequest:(e,t)=>N(`BAD_REQUEST`,`Bad request: ${e}`,{reason:e,expected:t}),conflict:(e,t)=>N(`CONFLICT`,`Conflict: ${e} already exists with value ${t}`,{resource:e,conflictingValue:t}),timeout:(e,t)=>N(`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}),F={rule:e=>t=>{if(e===`email`)return typeof t!=`string`||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)?T(P.validation(`value`,t,`must be a valid email`)):w(t);if(e===`url`)try{return new URL(String(t)),w(t)}catch{return T(P.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)?T(P.validation(`value`,t,`must be a valid UUID`)):w(t);if(e===`required`)return t==null||t===``?T(P.validation(`value`,t,`is required`)):w(t);if(e===`numeric`)return typeof t!=`number`&&!/^\d+$/.test(String(t))?T(P.validation(`value`,t,`must be numeric`)):w(t);if(e===`alpha`)return typeof t!=`string`||!/^[a-zA-Z]+$/.test(t)?T(P.validation(`value`,t,`must contain only letters`)):w(t);if(e===`alphanumeric`)return typeof t!=`string`||!/^[a-zA-Z0-9]+$/.test(t)?T(P.validation(`value`,t,`must be alphanumeric`)):w(t);if(e.startsWith(`min:`)){let n=Number(e.split(`:`)[1]),r=Number(t);return isNaN(r)||r<n?T(P.validation(`value`,t,`must be at least ${n}`)):w(t)}if(e.startsWith(`max:`)){let n=Number(e.split(`:`)[1]),r=Number(t);return isNaN(r)||r>n?T(P.validation(`value`,t,`must be at most ${n}`)):w(t)}if(e.startsWith(`minLength:`)){let n=Number(e.split(`:`)[1]);return String(t).length<n?T(P.validation(`value`,t,`must be at least ${n} characters`)):w(t)}if(e.startsWith(`maxLength:`)){let n=Number(e.split(`:`)[1]);return String(t).length>n?T(P.validation(`value`,t,`must be at most ${n} characters`)):w(t)}if(e.startsWith(`pattern:`)){let n=e.substring(8);return new RegExp(n).test(String(t))?w(t):T(P.validation(`value`,t,`must match pattern ${n}`))}if(e.startsWith(`in:`)){let n=e.substring(3).split(`,`);return n.includes(String(t))?w(t):T(P.validation(`value`,t,`must be one of: ${n.join(`, `)}`))}if(e.startsWith(`notIn:`)){let n=e.substring(6).split(`,`);return n.includes(String(t))?T(P.validation(`value`,t,`must not be one of: ${n.join(`, `)}`)):w(t)}if(e===`date`){let e=new Date(String(t));return isNaN(e.getTime())?T(P.validation(`value`,t,`must be a valid date`)):w(t)}if(e===`future`){let e=new Date(String(t));return isNaN(e.getTime())||e<=new Date?T(P.validation(`value`,t,`must be a future date`)):w(t)}if(e===`past`){let e=new Date(String(t));return isNaN(e.getTime())||e>=new Date?T(P.validation(`value`,t,`must be a past date`)):w(t)}return w(t)},combine:(...e)=>t=>{for(let n of e){let e=n(t);if(e.isLeft())return e}return w(t)},custom:(e,t)=>n=>e(n)?w(n):T(P.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=P.validation(i,e,t.context.rule);n.push(r)}else r[i]=o.orThrow()}return n.length>0?T(C(n)):w(r)}},en={...F,validators:{email:F.rule(`email`),url:F.rule(`url`),uuid:F.rule(`uuid`),required:F.rule(`required`),numeric:F.rule(`numeric`),positiveNumber:F.combine(F.rule(`numeric`),F.rule(`min:0`)),nonEmptyString:F.combine(F.rule(`required`),F.custom(e=>typeof e==`string`&&e.trim().length>0,`must not be empty`))}},tn=i(F.rule,en);function nn(e){return typeof e==`object`&&!!e&&`orThrow`in e&&typeof e.orThrow==`function`}function rn(e){return nn(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 an=e=>({_tag:`Context`,services:e,get(t){let n=e.get(t.id);return n===void 0?m():f(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),an(r)},merge(t){let n=new Map(e);for(let[e,r]of t.services)n.set(e,r);return an(n)},get size(){return e.size},toString(){return`Context(${Array.from(e.keys()).join(`, `)})`}}),I={empty:()=>an(new Map),make:(e,t)=>{let n=new Map;return n.set(e.id,t),an(n)},isContext:e=>typeof e==`object`&&!!e&&e._tag===`Context`},L=e=>({[Symbol.toStringTag]:`Exit`,_tag:`Success`,isSuccess(){return!0},isFailure(){return!1},isInterrupted(){return!1},map(t){return L(t(e))},mapError(t){return L(e)},mapBoth(t,n){return L(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 f(e)},toEither(){return w(e)},toValue(){return{_tag:`Success`,value:e}},toString(){return`Exit.Success(${r(e)})`},toJSON(){return{_tag:`Success`,value:e}}}),on=e=>({[Symbol.toStringTag]:`Exit`,_tag:`Failure`,isSuccess(){return!1},isFailure(){return!0},isInterrupted(){return!1},map(t){return on(e)},mapError(t){return on(t(e))},mapBoth(t,n){return on(t(e))},flatMap(t){return on(e)},fold(t,n,r){return t(e)},match(t){return t.Failure(e)},orThrow(){throw e},orElse(e){return e},toOption(){return m()},toEither(){return T(e)},toValue(){return{_tag:`Failure`,error:e}},toString(){return`Exit.Failure(${r(e)})`},toJSON(){return{_tag:`Failure`,error:e}}}),sn=e=>({[Symbol.toStringTag]:`Exit`,_tag:`Interrupted`,isSuccess(){return!1},isFailure(){return!1},isInterrupted(){return!0},map(t){return sn(e)},mapError(t){return sn(e)},mapBoth(t,n){return sn(e)},flatMap(t){return sn(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 m()},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}}}),R=s(e=>L(e),{succeed:e=>L(e),fail:e=>on(e),interrupt:e=>sn(e),interrupted:()=>sn(`interrupted`),isSuccess:e=>e.isSuccess(),isFailure:e=>e.isFailure(),isInterrupted:e=>e.isInterrupted(),fromEither:e=>e.isRight()?L(e.value):on(e.value),fromOption:(e,t)=>e.isSome()?L(e.value):on(t()),zip:(e,t)=>e.isInterrupted()?e:t.isInterrupted()?t:e.isFailure()?e:t.isFailure()?t:L([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 L(t)}}),z=e=>e;var cn=class extends Error{constructor(e,t){super(t??`Effect timed out after ${e}ms`),this.duration=e,this._tag=`TimeoutError`,this.name=`TimeoutError`}},ln=class extends Error{constructor(e){super(e??`Effect was interrupted`),this._tag=`InterruptedError`,this.name=`InterruptedError`}};const un=Symbol.for(`functype/IO/effect`),B=e=>e[un],V=e=>{let t={[Symbol.toStringTag]:`IO`,[un]:e,map(e){return V(z({_tag:`Map`,effect:t,f:e}))},flatMap(e){return V(z({_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 V(z({_tag:`MapError`,effect:t,f:e}))},tapError(e){return t.mapError(t=>(e(t),t))},recover(e){return V(z({_tag:`Recover`,effect:t,fallback:e}))},recoverWith(e){return V(z({_tag:`RecoverWith`,effect:t,f:e}))},fold(e,n){return V(z({_tag:`Fold`,effect:t,onFailure:e,onSuccess:n}))},match(e){return t.fold(e.failure,e.success)},catchTag(e,n){return V(z({_tag:`RecoverWith`,effect:t,f:t=>typeof t==`object`&&t&&`_tag`in t&&t._tag===e?z(n(t)):z(W.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(()=>W.sleep(n).flatMap(()=>t.retryWithDelay(e-1,n)))},retryWhile(e){let n=(r,i)=>t.recoverWith(t=>{if(r<=0||!e.while(t,i))return z(W.fail(t));let a=n(r-1,i+1);return e.delayMs===void 0?a:z(W.sleep(e.delayMs).flatMap(()=>a))});return n(e.n,1)},retryWithBackoff(e){let n=e.factor??2,r=e.maxMs??3e4,i=e.jitter??!0,a=e.while??(()=>!0),o=(s,c)=>t.recoverWith(t=>{if(s<=0||!a(t,c))return z(W.fail(t));let l=Math.min(r,e.baseMs*n**(c-1)),u=i?l*(.5+Math.random()*.5):l,d=o(s-1,c+1);return z(W.sleep(u).flatMap(()=>d))});return o(e.n,1)},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 V(z({_tag:`ProvideContext`,effect:t,context:e}))},provideService(e,n){return V(z({_tag:`ProvideContext`,effect:t,context:I.make(e,n)}))},provideLayer(e){return z(z(W.async(async()=>{let t=I.empty();return await e.build(z(t))})).flatMap(e=>V(z({_tag:`ProvideContext`,effect:t,context:e}))))},async run(){let e=await U(B(this));return e.isSuccess()?w(e.orThrow()):T(e.isFailure()?e.toValue().error:new ln)},async runOrThrow(){let e=await U(B(this));if(e.isSuccess())return e.orThrow();throw e.isFailure()?e.toValue().error:new ln},runSync(){try{return w(H(B(this)))}catch(e){return T(e)}},runSyncOrThrow(){return H(B(this))},async runExit(){return U(B(this))},async runOption(){let e=await U(B(this));return e.isSuccess()?f(e.orThrow()):m()},async runTry(){let e=await U(B(this));if(e.isSuccess())return z(x(()=>e.orThrow()));let t=e.isFailure()?e.toValue().error:Error(`Effect was interrupted`);return z(x(()=>{throw t}))},pipe(e){return e(t)},delay(e){return z(W.async(()=>new Promise(t=>setTimeout(t,e))).flatMap(()=>t))},timeout(e){return V(z({_tag:`Timeout`,effect:t,duration:e}))},timeoutTo(e,n){return z(t.timeout(e).recover(z(n)))},toString(){return`IO(${r(e._tag)})`},toJSON(){return{_tag:`IO`,effect:e._tag}},*[Symbol.iterator](){return yield t}};return t},H=(e,t=I.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=H(B(e.effect),t);return e.f(n)}case`FlatMap`:{let n=H(B(e.effect),t);return H(B(e.f(n)),t)}case`MapError`:try{return H(B(e.effect),t)}catch(t){throw e.f(t)}case`Recover`:try{return H(B(e.effect),t)}catch{return e.fallback}case`RecoverWith`:try{return z(H(B(e.effect),t))}catch(n){return H(B(e.f(n)),t)}case`Fold`:try{let n=H(B(e.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 H(B(e.effect),n)}case`Interrupt`:throw new ln;case`Bracket`:{let n=H(B(e.acquire),t);try{return H(B(e.use(n)),t)}finally{H(B(e.release(n)),t)}}case`BracketExit`:{let n=H(B(e.acquire),t),r;try{let i=H(B(e.use(n)),t);return r=z(R.succeed(i)),i}catch(e){throw r=z(R.fail(e)),e}finally{H(B(e.release(n,r)),t)}}case`Race`:throw Error(`Cannot run race effect synchronously`);case`Timeout`:throw Error(`Cannot run timeout effect synchronously`)}},U=async(e,t=I.empty())=>{try{switch(e._tag){case`Succeed`:return z(R.succeed(e.value));case`Fail`:return z(R.fail(e.error));case`Die`:throw e.defect;case`Sync`:return z(R.succeed(e.thunk()));case`Async`:{let t=await e.thunk();return z(R.succeed(t))}case`Auto`:{let t=e.thunk();return t instanceof Promise?z(R.succeed(await t)):z(R.succeed(t))}case`Map`:{let n=await U(B(e.effect),t);return n.isSuccess()?z(R.succeed(e.f(n.orThrow()))):z(n)}case`FlatMap`:{let n=await U(B(e.effect),t);return n.isSuccess()?U(B(e.f(n.orThrow())),t):z(n)}case`MapError`:{let n=await U(B(e.effect),t);return n.isSuccess()?z(n):n.isFailure()?z(R.fail(e.f(n.toValue().error))):z(n)}case`Recover`:{let n=await U(B(e.effect),t);return n.isSuccess()?n:R.succeed(e.fallback)}case`RecoverWith`:{let n=await U(B(e.effect),t);return n.isSuccess()?z(n):n.isFailure()?U(B(e.f(n.toValue().error)),t):z(n)}case`Fold`:{let n=await U(B(e.effect),t);return n.isSuccess()?R.succeed(e.onSuccess(n.orThrow())):n.isFailure()?R.succeed(e.onFailure(n.toValue().error)):n}case`Service`:{let n=t.get(e.tag);return n.isNone()?R.fail(Error(`Service not found: ${e.tag.id}`)):R.succeed(n.orThrow())}case`ProvideContext`:{let n=t.merge(e.context);return U(B(e.effect),n)}case`Interrupt`:return R.interrupted();case`Bracket`:{let n=await U(B(e.acquire),t);if(!n.isSuccess())return n;let r=n.orThrow();try{return await U(B(e.use(r)),t)}finally{await U(B(e.release(r)),t)}}case`BracketExit`:{let n=await U(B(e.acquire),t);if(!n.isSuccess())return n;let r=n.orThrow(),i=await U(B(e.use(r)),t);return await U(B(e.release(r,i)),t),i}case`Race`:return e.effects.length===0?R.fail(Error(`No effects to race`)):await Promise.race(e.effects.map(e=>U(B(e),t)));case`Timeout`:{let n=new Promise(t=>setTimeout(()=>t(R.fail(new cn(e.duration))),e.duration)),r=U(B(e.effect),t);return Promise.race([r,n])}}}catch(e){return R.fail(e)}},W={sync:e=>V({_tag:`Sync`,thunk:e}),succeed:e=>V({_tag:`Succeed`,value:e}),fail:e=>V({_tag:`Fail`,error:e}),die:e=>V({_tag:`Die`,defect:e}),async:e=>V(z({_tag:`Async`,thunk:e})),tryPromise:e=>V({_tag:`Async`,thunk:e.try}).mapError(e.catch),tryCatch:(e,t)=>W.sync(()=>{try{return e()}catch(e){throw t(e)}}),liftSync:e=>(...t)=>W.sync(()=>e(...t)),liftPromise:e=>(...t)=>W.async(()=>e(...t)),fromEither:e=>z(e.isRight()?W.succeed(e.value):W.fail(e.value)),fromOption:e=>z(e.isSome()?W.succeed(e.value):W.fail(void 0)),fromOptionOrFail:(e,t)=>z(e.isSome()?W.succeed(e.value):W.fail(t())),fromTry:e=>z(e.isSuccess()?W.succeed(e.orThrow()):W.fail(e.error)),fromResult:e=>z(e.error?W.fail(e.error):W.succeed(h(e.data))),tryAsync:(e,t,n)=>n?.aborted?z(W.fail(t(n.reason??new DOMException(`Aborted`,`AbortError`)))):W.async(()=>e(n)).mapError(t),asyncResult:(e,t,n)=>{let r=n?.dataKey??`data`,i=n?.errorKey??`error`;return W.tryAsync(t=>e(t),t,n?.signal).flatMap(e=>W.fromResult({data:e[r],error:e[i]}))},service:e=>V({_tag:`Service`,tag:e}),serviceWith:(e,t)=>W.service(e).map(t),serviceWithIO:(e,t)=>W.service(e).flatMap(t),withServices:(e,t)=>{let n=Object.entries(e);if(n.length===0)return z(V({_tag:`Auto`,thunk:()=>t({})}));let r=z(W.succeed({}));return z(n.reduce((e,[t,n])=>z(e.flatMap(e=>W.service(n).map(n=>({...e,[t]:n})))),r).flatMap(e=>V({_tag:`Auto`,thunk:()=>t(e)})))},all:e=>{if(e.length===0)return z(W.succeed([]));let t=z(W.succeed([]));return z(e.reduce((e,t)=>e.flatMap(e=>t.map(t=>[...e,t])),t))},firstSuccessOf:e=>e.length===0?z(W.fail(Error(`No effects provided`))):e.reduce((e,t)=>e.recoverWith(()=>t)),sleep:e=>z(W.async(()=>new Promise(t=>setTimeout(t,e)))),never:()=>z(W.async(()=>new Promise(()=>{}))),get unit(){return z(V({_tag:`Succeed`,value:void 0}))},fromNullable:e=>z(e==null?W.fail(void 0):W.succeed(e)),interrupt:()=>V({_tag:`Interrupt`}),bracket:(e,t,n)=>V({_tag:`Bracket`,acquire:e,use:t,release:n}),acquireRelease:(e,t,n)=>W.bracket(e,t,n),bracketExit:(e,t,n)=>V({_tag:`BracketExit`,acquire:e,use:t,release:n}),race:e=>V({_tag:`Race`,effects:e}),any:e=>e.length===0?z(W.fail(Error(`No effects provided`))):e.reduce((e,t)=>e.recoverWith(()=>t)),forEach:(e,t)=>{if(e.length===0)return z(W.succeed([]));let n=z(W.succeed([]));return z(e.reduce((e,n)=>e.flatMap(e=>t(n).map(t=>[...e,t])),n))},forEachPar:(e,t)=>W.forEach(e,t),timeout:(e,t)=>V(z({_tag:`Timeout`,effect:e,duration:t})),gen:e=>z(W.sync(()=>{let t=e(),n=e=>{let r=t.next(e);return r.done?z(W.succeed(r.value)):z(r.value.flatMap(e=>n(e)))};return n(void 0)}).flatMap(e=>e)),get Do(){return dn(W.succeed({}))}},dn=e=>({effect:e,bind(t,n){return dn(e.flatMap(e=>n(e).map(n=>({...e,[t]:n}))))},let(t,n){return dn(e.map(e=>({...e,[t]:n(e)})))},map(t){return e.map(t)},flatMap(t){return e.flatMap(t)},tap(t){return dn(e.tap(t))},tapEffect(t){return dn(e.tapEffect(t))},done(){return e}}),G=s(e=>V(z({_tag:`Auto`,thunk:e})),W),K=(e,t)=>({_tag:`Layer`,build:e,provideToAndMerge(t){return K(async n=>{let r=await e(n),i=n.merge(r),a=await t.build(i);return r.merge(a)})},merge(t){return K(async n=>{let[r,i]=await Promise.all([e(n),t.build(n)]);return r.merge(i)})},map(t){return K(async n=>t(await e(n)))},toString(){return`Layer(${t??`anonymous`})`}}),fn={succeed:(e,t)=>K(()=>Promise.resolve(I.make(e,t)),e.id),effect:(e,t)=>K(async()=>{let n=await t();return I.make(e,n)},e.id),sync:(e,t)=>K(()=>Promise.resolve(I.make(e,t())),e.id),fromService:(e,t,n)=>K(r=>{let i=r.unsafeGet(t);return Promise.resolve(I.make(e,n(i)))},e.id),fromServiceEffect:(e,t,n)=>K(async r=>{let i=await n(r.unsafeGet(t));return I.make(e,i)},e.id),fromContext:e=>K(()=>Promise.resolve(e)),empty:()=>K(()=>Promise.resolve(I.empty()),`empty`),mergeAll:(...e)=>K(async t=>(await Promise.all(e.map(e=>e.build(t)))).reduce((e,t)=>e.merge(t),I.empty()))},pn=e=>({id:e,_tag:`Tag`,toString(){return`Tag(${e})`}}),mn=()=>{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})})}}},hn=pn(`TestClock`),gn={make:mn,tag:hn,test:async e=>e(mn()),get:G.service(hn),advance:e=>G.serviceWithIO(hn,t=>G.async(()=>t.advance(e))),setTime:e=>G.serviceWithIO(hn,t=>G.async(()=>t.setTime(e))),runAll:G.serviceWithIO(hn,e=>G.async(()=>e.runAll())),context:()=>{let e=mn();return{clock:e,context:I.make(hn,e)}}},_n={make:()=>{let e=mn(),t=I.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=mn();return _n.make().withService(hn,e)}},vn=pn(`HttpClient`),yn={},bn=s({},{networkError:(e,t,n)=>({_tag:`NetworkError`,url:e,method:t,cause:n}),httpStatusError:(e,t,n,r,i)=>({_tag:`HttpStatusError`,url:e,method:t,status:n,statusText:r,body:i}),decodeError:(e,t,n,r)=>({_tag:`DecodeError`,url:e,method:t,body:n,cause:r}),isNetworkError:e=>e._tag===`NetworkError`,isHttpStatusError:e=>e._tag===`HttpStatusError`,isDecodeError:e=>e._tag===`DecodeError`,match:(e,t)=>{switch(e._tag){case`NetworkError`:return t.NetworkError(e);case`HttpStatusError`:return t.HttpStatusError(e);case`DecodeError`:return t.DecodeError(e)}}}),xn=(e,t)=>!e||t.startsWith(`http://`)||t.startsWith(`https://`)?t:`${e.endsWith(`/`)?e.slice(0,-1):e}${t.startsWith(`/`)?t:`/${t}`}`,Sn=(e,t)=>{let n=new URLSearchParams;for(let e of Object.keys(t)){let r=t[e];if(r!=null)if(Array.isArray(r))for(let t of r)n.append(e,String(t));else n.append(e,String(r))}let r=n.toString();return r?`${e}${e.includes(`?`)?`&`:`?`}${r}`:e},Cn=(e,t,n)=>{let r=xn(e,t);return n?Sn(r,n):r},wn=(e,t)=>e[Symbol.toStringTag]===t,q=(e,t)=>{if(typeof e!=`object`||!e||e instanceof Date||e instanceof RegExp||typeof Buffer<`u`&&e instanceof Buffer)return e;if(wn(e,`Option`)){let n=e;return t===`tagged`?n._tag===`None`?{_tag:`None`,value:null}:{_tag:`Some`,value:q(n.value,t)}:n._tag===`None`?null:q(n.value,t)}if(wn(e,`Either`)){let n=e;if(t===`tagged`)return{_tag:n._tag,value:q(n.value,t)};if(n._tag===`Left`)throw Error(`Cannot serialize a Left in a request body — Either's failure path should not cross the wire as data. Resolve the Left before sending, or omit the field. (Left value: ${JSON.stringify(n.value)})`);return q(n.value,t)}if(wn(e,`Try`)){let n=e;if(t===`tagged`){if(n._tag===`Failure`){let e=n.error??Error(`unknown`);return{_tag:`Failure`,error:e.message,stack:e.stack}}return{_tag:`Success`,value:q(n.value,t)}}if(n._tag===`Failure`)throw n.error??Error(`Cannot serialize a Try Failure in a request body`);return q(n.value,t)}if(wn(e,`List`)){let n=e.toArray().map(e=>q(e,t));return t===`tagged`?{_tag:`List`,value:n}:n}if(wn(e,`FunctypeMap`)){let n=e.toValue().value;if(t===`tagged`)return{_tag:`Map`,value:n.map(([e,n])=>[e,q(n,t)])};let r={};for(let[e,i]of n){if(typeof e!=`string`)throw Error(`Cannot serialize Map with non-string keys to JSON (key: ${String(e)})`);r[e]=q(i,t)}return r}if(Array.isArray(e))return e.map(e=>q(e,t));let n={};for(let r of Object.keys(e))n[r]=q(e[r],t);return n},Tn=(e,t)=>{if(e==null)return{serialized:void 0,contentType:void 0};if(typeof e==`string`)return{serialized:e,contentType:void 0};if(typeof e==`object`||Array.isArray(e)){let n=q(e,t?`primitive`:`tagged`);return{serialized:JSON.stringify(n),contentType:`application/json`}}return{serialized:String(e),contentType:void 0}},En=e=>{let t=e.get(`content-type`)??``;return t.includes(`application/json`)?`json`:t.startsWith(`text/`)?`text`:`raw`},Dn=async(e,t,n,r,i,a)=>{let o=t??En(e.headers),s,c={};switch(o){case`json`:{let t=await e.text();c.value=t;try{s=JSON.parse(t)}catch(e){throw bn.decodeError(n,r,t,e)}break}case`text`:s=await e.text(),c.value=s;break;case`blob`:s=await e.blob();break;case`arrayBuffer`:s=await e.arrayBuffer();break;case`raw`:s=e;break}let l;if(i){let e=i(s);if(e.isLeft()){let t=c.value??(typeof s==`string`?s:JSON.stringify(s));throw bn.decodeError(n,r,t,e.value)}l=e.value}else if(a)try{l=a(s)}catch(e){let t=c.value??(typeof s==`string`?s:JSON.stringify(s));throw bn.decodeError(n,r,t,e)}else l=s;return{data:l,status:e.status,statusText:e.statusText,headers:e.headers}},On=(e,t)=>{let n={url:Cn(e.baseUrl,t.url,t.params),method:t.method,headers:{...e.defaultHeaders,...t.headers},body:t.body,signal:t.signal,parseAs:t.parseAs,flatten:t.flatten};return(e.beforeRequest?e.beforeRequest(n):G.succeed(n)).flatMap(n=>{let r=n.flatten??!0,i=(()=>{try{return{ok:!0,value:Tn(n.body,r)}}catch(e){return{ok:!1,cause:e}}})();if(!i.ok)return G.fail(bn.networkError(n.url,n.method,i.cause));let{serialized:a,contentType:o}=i.value,s={...n.headers,...o?{"Content-Type":o}:{}},c=G.tryAsync(r=>(e.fetch??globalThis.fetch)(n.url,{method:n.method,headers:s,body:a,signal:n.signal??r}).then(async e=>{if(!e.ok){let t=await e.text().catch(()=>``);throw bn.httpStatusError(n.url,n.method,e.status,e.statusText,t)}return Dn(e,n.parseAs,n.url,n.method,t.decode,t.validate)}),e=>typeof e==`object`&&e&&`_tag`in e?e:bn.networkError(n.url,n.method,e));return e.afterResponse?c.flatMap(t=>e.afterResponse(t).map(e=>e)):c})},kn=e=>On(yn,e),An=s({},{request:kn,get:(e,t)=>kn({...t,url:e,method:`GET`}),post:(e,t)=>kn({...t,url:e,method:`POST`}),put:(e,t)=>kn({...t,url:e,method:`PUT`}),patch:(e,t)=>kn({...t,url:e,method:`PATCH`}),delete:(e,t)=>kn({...t,url:e,method:`DELETE`}),head:(e,t)=>kn({...t,url:e,method:`HEAD`,parseAs:`raw`}),options:(e,t)=>kn({...t,url:e,method:`OPTIONS`,parseAs:`raw`}),client:e=>({request:t=>On(e,t),get:(t,n)=>On(e,{...n,url:t,method:`GET`}),post:(t,n)=>On(e,{...n,url:t,method:`POST`}),put:(t,n)=>On(e,{...n,url:t,method:`PUT`}),patch:(t,n)=>On(e,{...n,url:t,method:`PATCH`}),delete:(t,n)=>On(e,{...n,url:t,method:`DELETE`}),head:(t,n)=>On(e,{...n,url:t,method:`HEAD`,parseAs:`raw`}),options:(t,n)=>On(e,{...n,url:t,method:`OPTIONS`,parseAs:`raw`})})}),jn={toOption:e=>e.fold(()=>m(),e=>f(e)),toList:e=>e.fold(()=>C([]),e=>C([e])),toEither:(e,t)=>e.fold(()=>T(t),e=>w(e)),isEmpty:e=>e.fold(()=>!0,()=>!1),size:e=>e.fold(()=>0,()=>1)},Mn=e=>typeof e==`object`&&!!e&&(e._tag===`Some`||e._tag===`None`),J=e=>typeof e==`object`&&!!e&&e._tag===`List`,Nn=e=>typeof e==`object`&&!!e&&(e._tag===`Left`||e._tag===`Right`),Pn=e=>typeof e==`object`&&!!e&&(e._tag===`Success`||e._tag===`Failure`),Y=()=>{let e=(e,t)=>{if(Mn(e)||J(e)||Nn(e)||Pn(e))return e.map(e=>t(e));throw Error(`Unsupported functor type: ${JSON.stringify(e)}`)},t=e=>{if(Mn(e))return e.orThrow();if(J(e)){let t=e.toArray();if(t.length>0&&J(t[0])){let e=[];for(let n of t)J(n)&&e.push(...n.toArray());return C(e)}return e.flatten()}if(Nn(e))return e.isRight()?e.fold(()=>null,e=>e):e;if(Pn(e))return e.isSuccess()?e.orThrow():e;throw Error(`Unsupported functor type for flatten: ${JSON.stringify(e)}`)},n=(e,t)=>{if(Mn(e)||J(e)||Nn(e)||Pn(e))return e.flatMap(e=>t(e));throw Error(`Unsupported functor type for flatMap: ${JSON.stringify(e)}`)},r=(e,t)=>{if(Mn(e)&&Mn(t)||J(e)&&J(t)||Nn(e)&&Nn(t)||Pn(e)&&Pn(t))return e.flatMap(e=>t.map(t=>e(t)));throw Error(`Unsupported functor type for ap: ${JSON.stringify(e)}`)},i=e=>{if(Mn(e)){let t=e;if(t.isEmpty)return C([h.none()]);let n=t.orThrow();if(J(n))return n.map(e=>h(e));throw Error(`Unsupported inner container type for sequence`)}if(J(e)){let t=e.toArray();if(t.length===0)return h.none();let n=t[0];if(Mn(n)){for(let e of t)if(e.isEmpty)return h.none();return h(C(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:i,traverse:(t,n)=>i(e(t,e=>n(e))),_type:`HKT`}},Fn=Y();Y.map=(e,t)=>Fn.map(e,t),Y.flatten=e=>Fn.flatten(e),Y.flatMap=(e,t)=>Fn.flatMap(e,t),Y.ap=(e,t)=>Fn.ap(e,t),Y.sequence=e=>Fn.sequence(e),Y.traverse=(e,t)=>Fn.traverse(e,t),Y.isOption=Mn,Y.isList=J,Y.isEither=Nn,Y.isTry=Pn;const In=e=>({id:e,isSame:t=>t.id===e}),Ln=s(In,{of:e=>In(e),pure:e=>In(e)}),X=e=>{let t=!1,i,a,s=!1,c=()=>{if(!t)try{i=e(),t=!0}catch(e){throw a=e,s=!0,t=!0,e}if(s)throw a;return i};return{[Symbol.toStringTag]:`Lazy`,_tag:`Lazy`,get isEvaluated(){return t},orElse:e=>{try{return c()}catch{return e}},orNull:()=>{try{return c()}catch{return null}},orThrow:e=>{try{return c()}catch(t){throw e??t}},or:e=>Z(()=>{try{return c()}catch{return e.orThrow()}}),orUndefined:()=>{try{return c()}catch{return}},map:e=>Z(()=>e(c())),ap:e=>Z(()=>e.orThrow()(c())),mapAsync:async e=>{let t=await e(c());return Z(()=>t)},flatMap:e=>Z(()=>e(c()).orThrow()),flatMapAsync:async e=>{let t=await e(c());return Z(()=>t.orThrow())},filter:e=>Z(()=>{let t=c();return e(t)?f(t):m}),recover:e=>Z(()=>{try{return c()}catch(t){return e(t)}}),recoverWith:e=>Z(()=>{try{return c()}catch(t){return e(t).orThrow()}}),toOption:()=>{try{return f(c())}catch{return m}},toEither:()=>{try{return w(c())}catch(e){return T(e)}},toEitherWith:e=>{try{return w(c())}catch(t){return T(e(t))}},toTry:()=>x(()=>c()),tap:e=>Z(()=>{let t=c();return e(t),t}),tapError:e=>Z(()=>{try{return c()}catch(t){throw e(t),t}}),fold:e=>e(c()),foldWith:(e,t)=>{try{return t(c())}catch(t){return e(t)}},foldLeft:e=>t=>t(e,c()),foldRight:e=>t=>t(c(),e),match:e=>e.Lazy(c()),toString:()=>t&&!s?`Lazy(${r(i)})`:t&&s?`Lazy(<error: ${a instanceof Error?a.message:String(a)}>)`:`Lazy(<not evaluated>)`,toValue:()=>{try{return{_tag:`Lazy`,value:c()}}catch(e){return{_tag:`Lazy`,error:e instanceof Error?e:Error(String(e))}}},get size(){try{return c(),1}catch{return 0}},get isEmpty(){try{return c(),!1}catch{return!0}},contains:e=>{try{return c()===e}catch{return!1}},reduce:e=>c(),reduceRight:e=>c(),count:e=>{try{return+!!e(c())}catch{return 0}},find:e=>{try{let t=c();return e(t)?f(t):m}catch{return m}},exists:e=>{try{return e(c())}catch{return!1}},forEach:e=>{try{e(c())}catch{}},pipe:e=>e(c()),toJSON:()=>{try{return{"@functype":`Lazy`,_tag:`Lazy`,value:c()}}catch(e){return{"@functype":`Lazy`,_tag:`Lazy`,error:u(e)}}},serialize:()=>{try{return n(`Lazy`,c())}catch(e){return o(`Lazy`,`Lazy`,{error:u(e)})}},typeable:`Lazy`}},Rn={of:e=>X(e),fromValue:e=>X(()=>e),fromOption:(e,t)=>X(()=>e._tag===`Some`?e.value:t()),fromTry:e=>X(()=>e.orThrow()),fromEither:e=>X(()=>e.fold(e=>{throw e},e=>e)),fromPromise:e=>X(()=>{throw Error(`Promise not yet resolved. Use await on the promise before creating Lazy.`)}),fail:e=>X(()=>{throw e}),evaluated:e=>X(()=>e),fromJSON:e=>{let t=JSON.parse(e);if(t[`@functype`]!==void 0&&t[`@functype`]!==`Lazy`)throw Error(`Lazy.fromJSON: expected @functype="Lazy", got ${JSON.stringify(t[`@functype`])}`);if(t.error!==void 0){let e=typeof t.error==`object`?d(t.error):Error(t.error);return Rn.fail(e)}return Rn.evaluated(t.value)}},Z=s(X,Rn),zn={default:e=>t=>e(t),when:(e,t)=>n=>e(n)?t(n):void 0},Q=e=>({[Symbol.toStringTag]:`Obj`,_tag:`Obj`,data:e,get:t=>h(e[t]),set:(t,n)=>Q({...e,[t]:n}),assign:t=>Q({...e,...t}),merge:t=>Q({...e,...t}),when:(t,n)=>(typeof t==`function`?t():t)?Q({...e,...n}):Q(e),omit:(...t)=>{let n={...e};for(let e of t)delete n[e];return Q(n)},pick:(...t)=>{let n={};for(let r of t)r in e&&(n[r]=e[r]);return Q(n)},keys:()=>C(Object.keys(e)),values:()=>C(Object.values(e)),entries:()=>C(Object.entries(e).map(([e,t])=>c([e,t]))),has:t=>t in e,value:()=>e,get isEmpty(){return Object.keys(e).length===0},get size(){return Object.keys(e).length},map:t=>Q(t(e)),flatMap:t=>t(e),flatMapAsync:async t=>await t(e),ap:t=>{let n=t.data;return Q(n(e))},fold:(t,n)=>Object.keys(e).length===0?t():n(e),match:t=>t.Obj(e),foldLeft:t=>n=>n(t,e),foldRight:t=>n=>n(e,t),count:t=>+!!t(e),find:t=>t(e)?h(e):h(void 0),exists:t=>t(e),forEach:t=>t(e),reduce:t=>e,reduceRight:t=>e,contains:t=>JSON.stringify(e)===JSON.stringify(t),orElse:t=>e,orThrow:t=>e,or:t=>Q(e),orNull:()=>e,orUndefined:()=>e,toOption:()=>h(e),toEither:t=>w(e),toList:()=>C([e]),toTry:()=>x(()=>e),toPromise:()=>Promise.resolve(e),toString:()=>`Obj(${r(e)})`,toValue:()=>({_tag:`Obj`,value:e}),toJSON:()=>({"@functype":`Obj`,_tag:`Obj`,value:e}),pipe:t=>t(e),serialize:()=>n(`Obj`,e),doUnwrap(){return{ok:!0,value:e}}}),Bn=e=>Q(e),Vn={of:e=>Q(e),empty:()=>Q({}),fromJSON:e=>{let t=JSON.parse(e);if(t[`@functype`]!==void 0&&t[`@functype`]!==`Obj`)throw Error(`Obj.fromJSON: expected @functype="Obj", got ${JSON.stringify(t[`@functype`])}`);return Q(t.value)},fromBinary:e=>{let t=Buffer.from(e,`base64`).toString();return Vn.fromJSON(t)}},Hn=s(Bn,Vn),$=(e=[])=>{let t=[...e],r=()=>t.length,i=()=>t.length===0,a=e=>t.includes(e),o=e=>{if(t.length===0)throw Error(`Cannot reduce an empty stack`);return ne(t,e)},s=e=>{if(t.length===0)throw Error(`Cannot reduce an empty stack`);return re(t,e)},c=e=>$([...t,e]),l=()=>{if(i())return[$([]),h(null)];let e=[...t],n=e.pop();return[$(e),h(n)]},u=()=>i()?h(null):h(t[t.length-1]),d=e=>$(t.map(e)),f=e=>i()?$([]):t.reduce((t,n)=>e(n).toArray().reduce((e,t)=>e.push(t),t),$([])),p=e=>{let n=[];return t.forEach(t=>{e.toArray().forEach(e=>{n.push(e(t))})}),$(n)},m=async e=>i()?$([]):(await Promise.all(t.map(async t=>await e(t)))).reduce((e,t)=>t.toArray().reduce((e,t)=>e.push(t),e),$([])),ee=()=>C(t),te=()=>[...t],g=()=>`Stack(${t.join(`, `)})`,_=(e,n)=>t.reduce(n,e),ie=e=>n=>t.reduce(n,e),ae=e=>n=>t.reduceRight((e,t)=>n(t,e),e),oe=e=>i()?e.Empty():e.NonEmpty([...t]);return{[Symbol.toStringTag]:`Stack`,_tag:`Stack`,get size(){return r()},get isEmpty(){return i()},contains:a,reduce:o,reduceRight:s,push:c,pop:l,peek:u,map:d,flatMap:f,ap:p,flatMapAsync:m,toList:ee,toArray:te,toString:g,fold:_,foldLeft:ie,foldRight:ae,match:oe,toValue:()=>({_tag:`Stack`,value:t}),toJSON:()=>({"@functype":`Stack`,_tag:`Stack`,value:[...t]}),pipe:e=>e([...t]),serialize:()=>n(`Stack`,t)}},Un=(e=[])=>$(e),Wn={empty:()=>$([]),of:e=>$([e]),fromJSON:e=>{let t=JSON.parse(e);if(t[`@functype`]!==void 0&&t[`@functype`]!==`Stack`)throw Error(`Stack.fromJSON: expected @functype="Stack", got ${JSON.stringify(t[`@functype`])}`);return Gn(t.value)},fromYAML:e=>{let t=e.split(`
|
|
17
|
-
`)[1]?.split(`: `)[1];return Gn(t?JSON.parse(t):[])},fromBinary:e=>{let t=Buffer.from(e,`base64`).toString();return Wn.fromJSON(t)}},Gn=s(Un,Wn);var Kn=e({deserialize:()=>Qn,deserializeStrict:()=>$n,fromEnvelope:()=>nr,isFunctypeValue:()=>rr,serialize:()=>er,toEnvelope:()=>tr});let qn;const Jn=()=>(qn===void 0&&(qn={Option:e=>e._tag===`Some`?f(e.value):m(),Either:e=>e._tag===`Right`?w(e.value):T(e.value),Try:e=>{if(e._tag===`Success`)return x.success(e.value);let t=e.error!==void 0&&typeof e.error==`object`?d(e.error):Error(typeof e.error==`string`?e.error:``);return x.failure(t)},List:e=>C(e.value),Set:e=>se(e.value),Map:e=>ct(e.value),Obj:e=>Hn(e.value),Stack:e=>Gn(e.value),Tuple:e=>c(e.value),LazyList:e=>de(e.value),Lazy:e=>{if(e.error!==void 0){let t=typeof e.error==`object`?d(e.error):Error(e.error);return Z.fail(t)}return Z.evaluated(e.value)},Task:e=>{if(e._tag===`Ok`)return A.ok(e.value);let t=e.error!==void 0&&typeof e.error==`object`?d(e.error):Error(typeof e.error==`string`?e.error:`Unknown Task error`);return A.err(t)}}),qn),Yn=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Xn=e=>Yn(e)&&typeof e[`@functype`]==`string`,Zn=e=>{if(Array.isArray(e))return e.map(Zn);if(Xn(e)){let t=e[a],n=Jn()[t];if(n===void 0)throw Error(`Serialization.deserialize: unknown @functype marker ${JSON.stringify(t)}`);let r={};for(let t of Object.keys(e))r[t]=Zn(e[t]);return n(r)}if(Yn(e)){let t={};for(let n of Object.keys(e))t[n]=Zn(e[n]);return t}return e},Qn=e=>x(()=>Zn(JSON.parse(e))),$n=e=>x(()=>{let t=JSON.parse(e);if(!Xn(t))throw Error(`Serialization.deserializeStrict: input is not a functype envelope (no @functype marker at the top level)`);return Zn(t)}),er=e=>JSON.stringify(e??null),tr=e=>JSON.parse(JSON.stringify(e??null)),nr=e=>x(()=>Zn(e)),rr=e=>typeof e==`object`&&!!e&&typeof e.serialize==`function`&&typeof e._tag==`string`;function ir(e){let t=he({_tag:e._tag,impl:e.impl});return{...t,toValue:()=>({_tag:t._tag,value:e.value})}}export{Ke as $,Jt as A,re as At,Pt as B,rn as C,C as Ct,Zt as D,de as Dt,Qt as E,x as Et,Kt as F,f as Ft,k as G,ct as H,Wt as I,d as It,$e as J,A as K,Ut as L,u as Lt,Lt as M,m as Mt,zt as N,h as Nt,Xt as O,v as Ot,Gt as P,ee as Pt,Ye as Q,Bt as R,I as S,De as St,P as T,ge as Tt,it as U,M as V,O as W,Qe as X,Ze as Y,Xe as Z,fn as _,Ee as _t,zn as a,Ne as at,cn as b,Se as bt,Y as c,He as ct,bn as d,Re as dt,Ue as et,vn as f,Le as ft,pn as g,w as gt,_n as h,T as ht,Hn as i,ze as it,Ht as j,ne as jt,Yt as k,se as kt,jn as l,Pe as lt,hn as m,Ae as mt,Kn as n,Ve as nt,Z as o,Fe as ot,gn as p,E as pt,tt as q,Gn as r,Ie as rt,Ln as s,Me as st,ir as t,Be as tt,An as u,je as ut,G as v,Te as vt,tn as w,he as wt,R as x,we as xt,ln as y,Ce as yt,Vt as z};
|
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
# Brand Type Migration Guide
|
|
2
|
-
|
|
3
|
-
This guide helps you migrate from the old object-based Brand implementation to the new phantom type implementation.
|
|
4
|
-
|
|
5
|
-
## What Changed?
|
|
6
|
-
|
|
7
|
-
### Old Implementation (Object Wrappers)
|
|
8
|
-
|
|
9
|
-
- Branded values were **objects** with methods
|
|
10
|
-
- Required `.unbrand()` or `.unwrap()` to access the primitive value
|
|
11
|
-
- `typeof brandedString === "object"`
|
|
12
|
-
- Object overhead and indexed properties
|
|
13
|
-
|
|
14
|
-
### New Implementation (Phantom Types)
|
|
15
|
-
|
|
16
|
-
- Branded values **ARE** the primitive values
|
|
17
|
-
- No unwrapping needed - use directly
|
|
18
|
-
- `typeof brandedString === "string"`
|
|
19
|
-
- Zero runtime overhead
|
|
20
|
-
|
|
21
|
-
## Migration Steps
|
|
22
|
-
|
|
23
|
-
### 1. Remove `.unbrand()` and `.unwrap()` calls
|
|
24
|
-
|
|
25
|
-
**Before:**
|
|
26
|
-
|
|
27
|
-
```typescript
|
|
28
|
-
const userId = Brand("UserId", "user-123")
|
|
29
|
-
const id = userId.unbrand() // Had to unwrap
|
|
30
|
-
console.log(`User: ${userId.unbrand()}`)
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
**After:**
|
|
34
|
-
|
|
35
|
-
```typescript
|
|
36
|
-
const userId = Brand("UserId", "user-123")
|
|
37
|
-
const id = userId // It IS the string!
|
|
38
|
-
console.log(`User: ${userId}`)
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### 2. Remove `.toString()` for custom formatting
|
|
42
|
-
|
|
43
|
-
**Before:**
|
|
44
|
-
|
|
45
|
-
```typescript
|
|
46
|
-
const userId = Brand("UserId", "user-123")
|
|
47
|
-
console.log(userId.toString()) // "UserId(user-123)"
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
**After:**
|
|
51
|
-
|
|
52
|
-
```typescript
|
|
53
|
-
const userId = Brand("UserId", "user-123")
|
|
54
|
-
console.log(userId.toString()) // "user-123" - standard string method
|
|
55
|
-
console.log(userId) // "user-123"
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### 3. Update ValidatedBrand usage
|
|
59
|
-
|
|
60
|
-
**Before:**
|
|
61
|
-
|
|
62
|
-
```typescript
|
|
63
|
-
const email = EmailAddress.of("user@example.com")
|
|
64
|
-
if (!email.isEmpty) {
|
|
65
|
-
const branded = email.get()
|
|
66
|
-
sendEmail(branded.unbrand()) // Had to unwrap
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
**After:**
|
|
71
|
-
|
|
72
|
-
```typescript
|
|
73
|
-
const email = EmailAddress.of("user@example.com")
|
|
74
|
-
if (!email.isEmpty) {
|
|
75
|
-
const branded = email.get()
|
|
76
|
-
sendEmail(branded) // It IS a string!
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### 4. Update refine validators
|
|
81
|
-
|
|
82
|
-
**Before:**
|
|
83
|
-
|
|
84
|
-
```typescript
|
|
85
|
-
const SmallPositive = PositiveNumber.refine("SmallPositive", (n) => {
|
|
86
|
-
return n.unbrand() < 100 // Had to unwrap
|
|
87
|
-
})
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**After:**
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
const SmallPositive = PositiveNumber.refine("SmallPositive", (n) => {
|
|
94
|
-
return n < 100 // n IS a number!
|
|
95
|
-
})
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### 5. Remove type assertions for external APIs
|
|
99
|
-
|
|
100
|
-
**Before:**
|
|
101
|
-
|
|
102
|
-
```typescript
|
|
103
|
-
const config = {
|
|
104
|
-
userId: userId.unbrand(),
|
|
105
|
-
port: port.unbrand(),
|
|
106
|
-
}
|
|
107
|
-
await api.request(config)
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
**After:**
|
|
111
|
-
|
|
112
|
-
```typescript
|
|
113
|
-
const config = {
|
|
114
|
-
userId, // Already a string!
|
|
115
|
-
port, // Already a number!
|
|
116
|
-
}
|
|
117
|
-
await api.request(config)
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
## Common Patterns
|
|
121
|
-
|
|
122
|
-
### Working with Option/Either
|
|
123
|
-
|
|
124
|
-
When extracting branded values from Option or Either, you may need to adjust default values:
|
|
125
|
-
|
|
126
|
-
**Before:**
|
|
127
|
-
|
|
128
|
-
```typescript
|
|
129
|
-
const email = EmailAddress.of(input)
|
|
130
|
-
const value = email.map((e) => e.unbrand()).orElse("")
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
**After (Option 1 - Keep branded type):**
|
|
134
|
-
|
|
135
|
-
```typescript
|
|
136
|
-
const email = EmailAddress.of(input)
|
|
137
|
-
const value = email.orElse("" as Brand<"EmailAddress", string>)
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
**After (Option 2 - Use fold for clean extraction):**
|
|
141
|
-
|
|
142
|
-
```typescript
|
|
143
|
-
const email = EmailAddress.of(input)
|
|
144
|
-
const value = email.fold(
|
|
145
|
-
() => "", // Default value
|
|
146
|
-
(e) => e, // e IS already a string!
|
|
147
|
-
)
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
### Type-safe functions
|
|
151
|
-
|
|
152
|
-
Function signatures don't change, but implementation is cleaner:
|
|
153
|
-
|
|
154
|
-
**Before:**
|
|
155
|
-
|
|
156
|
-
```typescript
|
|
157
|
-
function processUser(userId: Brand<"UserId", string>) {
|
|
158
|
-
const id = userId.unbrand()
|
|
159
|
-
return db.query(`SELECT * FROM users WHERE id = '${id}'`)
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
**After:**
|
|
164
|
-
|
|
165
|
-
```typescript
|
|
166
|
-
function processUser(userId: Brand<"UserId", string>) {
|
|
167
|
-
return db.query(`SELECT * FROM users WHERE id = '${userId}'`)
|
|
168
|
-
}
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
## Benefits After Migration
|
|
172
|
-
|
|
173
|
-
1. **Better Performance**: No object allocation overhead
|
|
174
|
-
2. **Cleaner Code**: No more `.unbrand()` calls everywhere
|
|
175
|
-
3. **Natural JavaScript**: String interpolation, JSON serialization work directly
|
|
176
|
-
4. **Smaller Bundles**: Less code to ship
|
|
177
|
-
5. **Better Debugging**: Values show as primitives in debugger
|
|
178
|
-
|
|
179
|
-
## Compatibility
|
|
180
|
-
|
|
181
|
-
### If you need the old behavior
|
|
182
|
-
|
|
183
|
-
The `unbrand` utility function still exists for compatibility:
|
|
184
|
-
|
|
185
|
-
```typescript
|
|
186
|
-
import { unbrand } from "@/branded"
|
|
187
|
-
|
|
188
|
-
const userId = Brand("UserId", "user-123")
|
|
189
|
-
const plain = unbrand(userId) // Works but unnecessary
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
ValidatedBrand also provides an `unwrap` method:
|
|
193
|
-
|
|
194
|
-
```typescript
|
|
195
|
-
const email = EmailAddress.unsafeOf("user@example.com")
|
|
196
|
-
const plain = EmailAddress.unwrap(email) // Works but unnecessary
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
## Quick Reference
|
|
200
|
-
|
|
201
|
-
| Old Code | New Code |
|
|
202
|
-
| ------------------------------------ | --------------------------- |
|
|
203
|
-
| `value.unbrand()` | `value` |
|
|
204
|
-
| `value.unwrap()` | `value` |
|
|
205
|
-
| `value.toString()` | `value` or `String(value)` |
|
|
206
|
-
| `typeof value === "object"` | `typeof value === "string"` |
|
|
207
|
-
| `${value.unbrand()}` | `${value}` |
|
|
208
|
-
| `JSON.stringify({id: id.unbrand()})` | `JSON.stringify({id})` |
|
|
209
|
-
|
|
210
|
-
## Testing
|
|
211
|
-
|
|
212
|
-
Update your tests to expect primitives:
|
|
213
|
-
|
|
214
|
-
**Before:**
|
|
215
|
-
|
|
216
|
-
```typescript
|
|
217
|
-
expect(typeof userId).toBe("object")
|
|
218
|
-
expect(userId.unbrand()).toBe("user-123")
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
**After:**
|
|
222
|
-
|
|
223
|
-
```typescript
|
|
224
|
-
expect(typeof userId).toBe("string")
|
|
225
|
-
expect(userId).toBe("user-123")
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
## Summary
|
|
229
|
-
|
|
230
|
-
The migration is mostly about **removing code**. Branded values now work exactly like their underlying primitive types, making the code cleaner and more performant. The type safety remains unchanged - you still get full compile-time protection against mixing different branded types.
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# Bundle Size Optimization Guide
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
Functype is designed with tree-shaking in mind, allowing you to optimize your application's bundle size by only including the specific modules you need.
|
|
6
|
-
|
|
7
|
-
## Import Strategies
|
|
8
|
-
|
|
9
|
-
### Strategy 1: Selective Module Imports (Recommended)
|
|
10
|
-
|
|
11
|
-
Import only the specific modules you need to reduce bundle size significantly.
|
|
12
|
-
|
|
13
|
-
```typescript
|
|
14
|
-
import { Option } from "functype/option"
|
|
15
|
-
import { Either } from "functype/either"
|
|
16
|
-
|
|
17
|
-
// Usage
|
|
18
|
-
const option = Option.some(42)
|
|
19
|
-
const either = Either.right("value")
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
### Strategy 2: Direct Constructor Imports (Smallest Bundle)
|
|
23
|
-
|
|
24
|
-
For the most aggressive tree-shaking, import only the specific constructors and functions you need.
|
|
25
|
-
|
|
26
|
-
```typescript
|
|
27
|
-
import { some, none } from "functype/option"
|
|
28
|
-
import { right } from "functype/either"
|
|
29
|
-
|
|
30
|
-
// Usage
|
|
31
|
-
const option = some(42)
|
|
32
|
-
const none_value = none()
|
|
33
|
-
const either = right("value")
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Bundle Size Comparison
|
|
37
|
-
|
|
38
|
-
| Import Strategy | Approximate Bundle Size | Best For |
|
|
39
|
-
| --------------- | ------------------------ | -------------------------- |
|
|
40
|
-
| Selective | 200-500 bytes per module | Most applications |
|
|
41
|
-
| Direct | <200 bytes per feature | Size-critical applications |
|
|
42
|
-
|
|
43
|
-
## Common Module Sizes
|
|
44
|
-
|
|
45
|
-
| Module | Approximate Size (minified) | Gzipped Size |
|
|
46
|
-
| ------ | --------------------------- | ------------ |
|
|
47
|
-
| Option | ~200 bytes | ~140 bytes |
|
|
48
|
-
| Either | ~290 bytes | ~190 bytes |
|
|
49
|
-
| List | ~170 bytes | ~125 bytes |
|
|
50
|
-
| Try | ~170 bytes | ~125 bytes |
|
|
51
|
-
| Tuple | ~120 bytes | ~100 bytes |
|
|
52
|
-
| Task | ~200 bytes | ~140 bytes |
|
|
53
|
-
|
|
54
|
-
## Additional Tips
|
|
55
|
-
|
|
56
|
-
1. **Import Analysis**: Use tools like [webpack-bundle-analyzer](https://github.com/webpack-contrib/webpack-bundle-analyzer) or [rollup-plugin-visualizer](https://github.com/btd/rollup-plugin-visualizer) to analyze your bundle and identify opportunities for optimization.
|
|
57
|
-
|
|
58
|
-
2. **Dynamic Imports**: Consider using dynamic imports for rarely used functionality:
|
|
59
|
-
|
|
60
|
-
```typescript
|
|
61
|
-
// Only load when needed
|
|
62
|
-
const useRareFeature = async () => {
|
|
63
|
-
const { someLargeUtility } = await import("functype/some-large-module")
|
|
64
|
-
return someLargeUtility()
|
|
65
|
-
}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
3. **Development vs Production**: During development, you might prefer the convenience of importing everything. In production builds, switch to selective imports.
|
|
69
|
-
|
|
70
|
-
4. **Peer Dependencies**: Functype has minimal dependencies, and the only external dependency (`safe-stable-stringify`) is quite small.
|
|
71
|
-
|
|
72
|
-
## Need Help?
|
|
73
|
-
|
|
74
|
-
If you need assistance with optimizing your bundle size further, please open an issue on our GitHub repository.
|
package/readme/HKT.md
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
# Higher-Kinded Types (HKT)
|
|
2
|
-
|
|
3
|
-
Higher-kinded types allow for writing generic code that works across different container types like `Option`, `List`, `Either`, and `Try`. This is a powerful abstraction that lets you create algorithms that work with any type that supports certain operations, without having to rewrite them for each specific type.
|
|
4
|
-
|
|
5
|
-
## Introduction
|
|
6
|
-
|
|
7
|
-
In functional programming, many operations like `map`, `flatMap`, or `sequence` follow similar patterns across different data structures. The HKT module provides a unified way to work with these operations for any supporting container type.
|
|
8
|
-
|
|
9
|
-
## Key Concepts
|
|
10
|
-
|
|
11
|
-
1. **Kind**: A type-level function representing a higher-kinded type relationship
|
|
12
|
-
2. **Container Types**: Data structures that contain values (Option, List, Either, etc.)
|
|
13
|
-
3. **Type Constructor**: A function that takes a type and returns a new type
|
|
14
|
-
|
|
15
|
-
## Basic Operations
|
|
16
|
-
|
|
17
|
-
### Map
|
|
18
|
-
|
|
19
|
-
Apply a function to a value inside a container:
|
|
20
|
-
|
|
21
|
-
```typescript
|
|
22
|
-
import { Option, HKT } from "functype"
|
|
23
|
-
|
|
24
|
-
const option = Option(42)
|
|
25
|
-
const doubled = HKT.map(option, (x) => x * 2) // Option(84)
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### FlatMap
|
|
29
|
-
|
|
30
|
-
Apply a function that returns a container to a value inside a container, then flatten the result:
|
|
31
|
-
|
|
32
|
-
```typescript
|
|
33
|
-
const option = Option(42)
|
|
34
|
-
const result = HKT.flatMap(option, (x) => Option(x * 2)) // Option(84)
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
### Flatten
|
|
38
|
-
|
|
39
|
-
Flatten a nested container:
|
|
40
|
-
|
|
41
|
-
```typescript
|
|
42
|
-
const nestedOption = Option(Option(42))
|
|
43
|
-
const flattened = HKT.flatten(nestedOption) // Option(42)
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## Advanced Operations
|
|
47
|
-
|
|
48
|
-
### Sequence
|
|
49
|
-
|
|
50
|
-
Transform a container of containers into a container of container (e.g., `Option<List<A>>` to `List<Option<A>>`):
|
|
51
|
-
|
|
52
|
-
```typescript
|
|
53
|
-
const optionOfList = Option(List([1, 2, 3]))
|
|
54
|
-
const listOfOptions = HKT.sequence(optionOfList)
|
|
55
|
-
// List([Option(1), Option(2), Option(3)])
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Traverse
|
|
59
|
-
|
|
60
|
-
Transform each element in a container using a function that returns another container type, then sequence the results:
|
|
61
|
-
|
|
62
|
-
```typescript
|
|
63
|
-
const list = List([1, 2, 3])
|
|
64
|
-
const result = HKT.traverse(list, (x) => Option(x * 2))
|
|
65
|
-
// Option(List([2, 4, 6]))
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Applicative (ap)
|
|
69
|
-
|
|
70
|
-
Apply a function inside a container to a value inside another container:
|
|
71
|
-
|
|
72
|
-
```typescript
|
|
73
|
-
const optionFn = Option((x: number) => x * 2)
|
|
74
|
-
const optionValue = Option(21)
|
|
75
|
-
const result = HKT.ap(optionFn, optionValue) // Option(42)
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
## Supported Container Types
|
|
79
|
-
|
|
80
|
-
The HKT module currently supports the following container types:
|
|
81
|
-
|
|
82
|
-
- `Option<A>`
|
|
83
|
-
- `List<A>`
|
|
84
|
-
- `Either<E, A>`
|
|
85
|
-
- `Try<A>`
|
|
86
|
-
|
|
87
|
-
## Creating Generic Algorithms
|
|
88
|
-
|
|
89
|
-
The power of HKT is in creating algorithms that work with any container type:
|
|
90
|
-
|
|
91
|
-
```typescript
|
|
92
|
-
// A function that works with any container implementing map
|
|
93
|
-
function increment<F extends (a: number) => any>(container: Kind<F, number>): Kind<F, number> {
|
|
94
|
-
return HKT.map(container, (x) => x + 1)
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Works with any container
|
|
98
|
-
increment(Option(41)) // Option(42)
|
|
99
|
-
increment(List([1, 2, 3])) // List([2, 3, 4])
|
|
100
|
-
increment(Right<string, number>(41)) // Right(42)
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Implementing Your Own Container Types
|
|
104
|
-
|
|
105
|
-
To make your custom container types work with HKT, you need to:
|
|
106
|
-
|
|
107
|
-
1. Implement the appropriate methods (`map`, `flatMap`, etc.)
|
|
108
|
-
2. Add type checking in the HKT functions
|
|
109
|
-
|
|
110
|
-
This allows seamless integration with the rest of the functional programming ecosystem.
|