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.
Files changed (68) hide show
  1. package/dist/Companion-DiOMBHDG.js +1 -0
  2. package/dist/CompanionTypes-BVqO7Kc2.js +1 -0
  3. package/dist/CompanionTypes-CAxuM7qS.d.ts +58 -0
  4. package/dist/cli/exports.js +1 -1
  5. package/dist/cli/index.js +5 -5
  6. package/dist/companion/index.d.ts +2 -0
  7. package/dist/companion/index.js +1 -0
  8. package/dist/conditional/index.d.ts +2 -0
  9. package/dist/conditional/index.js +1 -0
  10. package/dist/core/task/index.d.ts +2 -0
  11. package/dist/core/task/index.js +1 -0
  12. package/dist/decoder/index.d.ts +2 -0
  13. package/dist/decoder/index.js +1 -0
  14. package/dist/do/index.d.ts +1 -1
  15. package/dist/do/index.js +1 -1
  16. package/dist/either/index.d.ts +1 -1
  17. package/dist/either/index.js +1 -1
  18. package/dist/fetch/index.d.ts +2 -0
  19. package/dist/fetch/index.js +1 -0
  20. package/dist/{full-interfaces-0pOr6idp.js → full-interfaces-BO3WRfCs.js} +1 -1
  21. package/dist/functype/index.d.ts +2 -0
  22. package/dist/functype/index.js +0 -0
  23. package/dist/{index-DBYBJg-D.d.ts → index-2qrljvxu.d.ts} +4832 -4889
  24. package/dist/index.d.ts +3 -3
  25. package/dist/index.js +1 -1
  26. package/dist/io/index.d.ts +2 -0
  27. package/dist/io/index.js +1 -0
  28. package/dist/lazy/index.d.ts +2 -0
  29. package/dist/lazy/index.js +1 -0
  30. package/dist/list/index.d.ts +1 -1
  31. package/dist/list/index.js +1 -1
  32. package/dist/logger/index.d.ts +36 -1
  33. package/dist/map/index.d.ts +1 -1
  34. package/dist/map/index.js +1 -1
  35. package/dist/obj/index.d.ts +2 -0
  36. package/dist/obj/index.js +1 -0
  37. package/dist/option/index.d.ts +1 -1
  38. package/dist/option/index.js +1 -1
  39. package/dist/serialization/index.d.ts +2 -0
  40. package/dist/serialization/index.js +1 -0
  41. package/dist/serialization-EQGLX3e3.js +4 -0
  42. package/dist/set/index.d.ts +1 -1
  43. package/dist/set/index.js +1 -1
  44. package/dist/src-CVFuTCru.js +17 -0
  45. package/dist/try/index.d.ts +1 -1
  46. package/dist/try/index.js +1 -1
  47. package/dist/tuple/index.js +1 -1
  48. package/dist/typeclass/index.d.ts +2 -0
  49. package/dist/typeclass/index.js +1 -0
  50. package/dist/typeclass-C61yDVYd.js +1 -0
  51. package/dist/util/index.d.ts +24 -0
  52. package/dist/util/index.js +1 -0
  53. package/package.json +5 -4
  54. package/dist/Logger-75yEf2wp.d.ts +0 -32
  55. package/dist/Tuple-knEoDiKZ.js +0 -4
  56. package/dist/src-P2lgP6cJ.js +0 -17
  57. package/readme/BRAND_MIGRATION_GUIDE.md +0 -230
  58. package/readme/BUNDLE_OPTIMIZATION.md +0 -74
  59. package/readme/HKT.md +0 -110
  60. package/readme/ROADMAP.md +0 -113
  61. package/readme/TASK-TODO.md +0 -33
  62. package/readme/TUPLE-EXAMPLES.md +0 -76
  63. package/readme/ai-guide.md +0 -384
  64. package/readme/examples.md +0 -1883
  65. package/readme/quick-reference.md +0 -462
  66. package/readme/task-error-handling.md +0 -283
  67. package/readme/tasks.md +0 -195
  68. package/readme/type-index.md +0 -225
@@ -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.