slang-ts 0.0.9 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -38,6 +38,11 @@ npm i slang-ts
38
38
 
39
39
  All utilities fully tested. See [tests](https://github.com/Hussseinkizz/slang/tree/main/tests)
40
40
 
41
+ ## New in v0.1.1
42
+
43
+ - **Ok messages**: `Ok(value, message?)` keeps an optional success message on the result, such as text to show the user. Results without one have no `message` property. (0.1.0 was published without this change; use 0.1.1 or later.)
44
+ - **Publishing**: `npm publish` now runs `bun run export` first (tests, type check, then build), so the package always ships a fresh build.
45
+
41
46
  ## New in v0.0.9
42
47
 
43
48
  - **SafeTry**: unwraps nested Result, Option, and Atom values into one result; nested failures now become the outer `Err`, while plain object properties and array elements stay unchanged.
@@ -134,8 +139,16 @@ const user = await fetchUser("123");
134
139
  if (user.isOk) {
135
140
  println("User:", user.value.name);
136
141
  }
142
+
143
+ // Optional success message as the second argument
144
+ const saved = Ok({ id: "123" }, "Profile saved");
145
+ if (saved.isOk) {
146
+ println(saved.message); // "Profile saved"
147
+ }
137
148
  ```
138
149
 
150
+ `andThen` and `safeTry` return new results, so a message stays with the value it described.
151
+
139
152
  ### Expect
140
153
 
141
154
  Unwraps values or throws with custom message. Use when failure is unrecoverable.
@@ -672,14 +685,14 @@ See [example.ts](https://github.com/Hussseinkizz/slang/blob/main/example.ts) for
672
685
 
673
686
  ## Development
674
687
 
675
- Install project dependencies with Bun, then build:
688
+ Install project dependencies with Bun, then export:
676
689
 
677
690
  ```bash
678
691
  bun install
679
- bun run build
692
+ bun run export
680
693
  ```
681
694
 
682
- The build runs tests, checks types with TypeScript 7.0.2, then uses tsdown 0.23.1 to produce minified ESM at `dist/index.js` and bundled types at `dist/index.d.ts`. Package imports keep the same entry points. tsdown currently marks its TypeScript 7 integration as experimental; the project build passes with this setup.
695
+ `export` runs the tests, checks types with TypeScript 7.0.2, then runs `bun run build`, which uses tsdown 0.23.1 to produce minified ESM at `dist/index.js` and bundled types at `dist/index.d.ts`. `npm publish` runs `export` first through `prepublishOnly`, so a release never ships a stale `dist/`. Package imports keep the same entry points. tsdown currently marks its TypeScript 7 integration as experimental; the project build passes with this setup.
683
696
 
684
697
  For building, tsdown requires Node.js `^22.18.0 || ^24.11.0 || >=26.0.0`. This is a build-tool requirement, not a new runtime requirement for Slang consumers.
685
698
 
package/dist/index.d.ts CHANGED
@@ -3,6 +3,8 @@ declare const __result__: unique symbol;
3
3
  export type Ok<T> = {
4
4
  type: "Ok";
5
5
  value: T;
6
+ /** Optional description of the success, such as a message to show the user. */
7
+ readonly message?: string;
6
8
  readonly isOk: true;
7
9
  readonly isErr: false;
8
10
  readonly [__result__]: true;
@@ -53,11 +55,14 @@ interface ResultMethods<T> {
53
55
  /**
54
56
  * Creates a new, successful result.
55
57
  * @param value Value of the result
58
+ * @param message Optional description of the success; omitted values leave no `message` property
56
59
  * @example
57
60
  * const a = Ok("hello");
58
61
  * typeof a; // Ok<"hello">
62
+ * const b = Ok({ id: 1 }, "Project created");
63
+ * b.message; // "Project created"
59
64
  */
60
- export declare function Ok<T>(value: T): Ok<T> & ResultMethods<T>;
65
+ export declare function Ok<T>(value: T, message?: string): Ok<T> & ResultMethods<T>;
61
66
  /**
62
67
  * Creates a new, failed result with a string error message.
63
68
  * @param error Error message (must be a string)
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  const e=e=>{let t=globalThis?.queueMicrotask;typeof t==`function`?t(e):Promise.resolve().then(e)},t=e=>typeof e==`object`&&!!e&&`type`in e&&(e.type===`Ok`||e.type===`Err`),n=Symbol(`slang.activate`),r=e=>typeof e==`object`&&!!e&&`isSome`in e&&`isNone`in e,i=e=>typeof e==`object`&&!!e&&typeof e.valueOf?.()==`symbol`;function a(e){return i(e)?{ok:!0,value:e.valueOf().description}:t(e)?e.isOk?{ok:!0,value:e.value}:{ok:!1,error:typeof e.error==`string`?e.error:String(e.error)}:r(e)?e.isSome?{ok:!0,value:e.value}:{ok:!1,error:`Option was None`}:{ok:!0,value:e}}let o=`development`,s=null;const c=e=>{typeof e==`object`&&e?s=e.printFn??null:o=e===`production`||e===`prod`?`production`:`development`},l=e=>{if(typeof e==`string`)return e;if(typeof e==`symbol`)return String(e);if(typeof e==`function`)return`[Function ${e.name}]`;try{return String(e)}catch{try{return JSON.stringify(e)??`null`}catch{return Object.prototype.toString.call(e)}}},u=(...e)=>{let t=e.map(l).join(` `).concat(`
2
- `);s?s(t):o!==`production`&&globalThis.console?.log?.(t)};function d(e){throw Error(e)}function f(t){let n=Object.freeze({type:`Ok`,value:t,isOk:!0,isErr:!1}),r=e=>{try{let t=e(n.value);return t instanceof Promise?t.then(e=>e===void 0?i:f(e)).catch(e=>p(e instanceof Error?e.message:String(e))):t===void 0?i:f(t)}catch(e){return p(e instanceof Error?e.message:String(e))}},i={...n,expect:(e=>n.value),unwrap:(()=>(e(()=>{}),{else(e){return n.value}})),andThen:r};return i}function p(t){let n=Object.freeze({type:`Err`,error:t,isOk:!1,isErr:!0}),r=e=>i,i={...n,expect:(e=>{throw Error(e??t)}),unwrap:(()=>{let n=!1;return e(()=>{if(!n)throw Error(t)}),{else(e){return n=!0,typeof e==`function`?e(t):e}}}),andThen:r};return i}const m=e=>e==null||e===``||Number.isNaN(e)||e===1/0||e===-1/0;function h(e){if(m(e))throw Error(`Cannot wrap null, undefined, NaN, or empty string in Some`);return Object.freeze({type:`Some`,value:e,isSome:!0,isNone:!1})}const g=Object.freeze({type:`None`,isSome:!1,isNone:!0});let _=null;function v(e){_=e}function y(t){let n=m(t)?g:h(t),r=(e=>{if(!_)throw Error(`Converter not initialized`);return _(n,e)}),i=(e=>{if(n.isSome)return n.value;throw Error(e??`Expected Some, got None`)}),a=(()=>{let t=!1,r=n;return e(()=>{if(!t)throw Error(`Expected else`)}),{else(e){if(t=!0,r.isSome)return r.value;let n=typeof e==`function`?e(void 0):e;if(m(n))throw Error(`Fallback must be truthy`);return n}}}),o=(e=>{let t=n;if(t.isNone)return s;let r=t.value;try{let t=e(r);return t instanceof Promise?t.then(e=>e===void 0?s:y(e)).catch(()=>y(null)):t===void 0?s:y(t)}catch{return y(null)}}),s={...n,to:r,expect:i,unwrap:a,andThen:o};return s}const b=e=>{if(typeof e!=`object`||!e)return e;let t=e;return t.isSome===!0||t.isOk===!0?t.value:e},x=e=>{if(typeof e==`object`&&e){let t=e;if(t.isNone===!0||t.isErr===!0)return!0}return m(b(e))};function S(e,t=p(`No value!`)){for(let t of e)if(!x(t))return f(b(t));return t}let C=null;function w(e){C=e}function T(e){let t=Symbol(e),n=Object(t);return n.to=(e=>{if(!C)throw Error(`Converter not initialized`);return C(t,e)}),n.andThen=t=>{let r;try{r=t(e)}catch(e){d(`Atom.andThen: fn threw an error: ${e instanceof Error?e.message:String(e)}`)}return r===void 0?n:(typeof r!=`string`&&d(`Atom.andThen: fn must return a string, got ${typeof r}`),T(r))},n}const E=e=>typeof e==`object`&&!!e&&`isSome`in e&&`isNone`in e;function D(e,t){if(e&&(e.type===`Ok`||e.type===`Err`))throw Error(`Cannot convert a Result to any other type`);switch(t){case`option`:return E(e)?e:y(typeof e==`symbol`?e.description:e);case`atom`:if(E(e)){if(e.isNone)throw Error(`Cannot convert None to Atom`);if(typeof e.value!=`string`)throw Error(`Only string values can be converted to Atom`);return T(e.value)}if(typeof e==`symbol`)return e;throw Error(`Cannot convert type ${typeof e} to Atom`);case`result`:return E(e)?e.isSome?f(e.value):p(`Value is None`):f(typeof e==`symbol`?e.description:e);default:throw Error(`Invalid target: ${t}`)}}v(D),w(D);function O(e,t){let n=t[e.type];if(!n)throw Error(`Non-exhaustive match — missing handler for '${e.type}'`);return n(e)}const k=e=>typeof e==`string`||typeof e==`number`||typeof e==`boolean`||typeof e==`symbol`;function A(e,t){let n=e=>typeof e?.valueOf==`function`?e.valueOf():e,r=e=>typeof e==`symbol`?e.description:void 0,i=n(e);if(!k(i))throw Error(`Unsupported match all value type: ${typeof i}`);let a=r(i)??i,o=typeof a==`boolean`||typeof a==`number`?String(a):a;return o!=null&&o in t?t[o](e):t._()}function j(e,t=!1){if(!t&&!Array.isArray(e))throw Error(`Only arrays allowed when includeValues=false`);return Array.isArray(e)?e:e instanceof Set?Array.from(e):Object.values(e)}function M(e,t){let{fillValue:n,includeValues:r=!1}=t||{};if(e.length===0)return[];let i=e.map(e=>j(e,r)),a=Math.max(...i.map(e=>e.length)),o=Math.min(...i.map(e=>e.length)),s=n===void 0?o:a,c=[];for(let e=0;e<s;e++)c.push(i.map(t=>e<t.length?t[e]:n));return c}function N(e,t,n){return M(e,n).map(t)}function P(e){if(e.length===0)return[];let t=e[0]?.length??0,n=Array.from({length:t},()=>[]);for(let t of e)t.forEach((e,t)=>n[t]?.push(e));return n}async function F(e,n){let o=n?.throw??!1;try{let n=a(await e()),o=/* @__PURE__ */ new Set;for(;n.ok;){let e=n.value;if(!i(e)&&!t(e)&&!r(e))return f(e);if(typeof e==`object`&&e){if(o.has(e))return p(`Cannot resolve a circular value`);o.add(e)}n=a(e)}return p(n.error)}catch(e){let t=e instanceof Error?e.message:String(e);if(o)throw e instanceof Error?e:Error(t);return p(t)}}function I(e){return e.error??`Unknown error`}function L(e){let t=a(e);return t.ok?f(t.value):p(t.error)}async function R(e,n){try{let r=await e(n);return t(r)?r:p(`Pipeline function must return a Result`)}catch(e){return p(e instanceof Error?e.message:String(e))}}function z(e,...t){return{async run(n){let{onEach:r,onSuccess:i,onError:a,allowErrors:o=!1}=n??{},s=L(e);for(let e=0;e<t.length;e++){let n=t[e],i=t[e+1];if(s.isErr&&!o)return a?.(Error(I(s))),s;s=await R(n,s),r?.({prevResult:s,currentFn:n.name||`fn${e+1}`,nextFn:i?i.name||`fn${e+2}`:void 0})}return s.isOk?i?.(s.value):a?.(Error(I(s))),s}}}function B(){let e=new AbortController;return Object.assign(e.signal,{fire:()=>e.abort()})}const V=e=>e instanceof Error?e.message:String(e),H=(e,t)=>{if(e.aborted)return t.abort(),()=>{};let n=()=>t.abort();return e.addEventListener(`abort`,n,{once:!0}),()=>e.removeEventListener(`abort`,n)};function U(e,t={}){let r=new AbortController,i=B(),o=()=>{},s=new Promise(e=>{o=e}),c=!1,l=!1,u=e=>{l||(l=!0,o(e),i.fire())},d=async(e,n,i)=>{let o=!1,s,c=i===void 0?()=>{}:H(i,n),l=H(r.signal,n);t.timeout!==void 0&&(s=setTimeout(()=>{o=!0,n.abort()},t.timeout));let u=e=>(s!==void 0&&clearTimeout(s),c(),l(),e);try{let t=a(await e(n.signal));return n.signal.aborted?r.signal.aborted?u({kind:`aborted`}):i?.aborted?u({kind:`stopped`}):u(o?{kind:`timedOut`}:{kind:`aborted`}):t.ok?u({kind:`value`,value:t.value}):u({kind:`error`,error:t.error})}catch(e){return r.signal.aborted?u({kind:`aborted`}):i?.aborted?u({kind:`stopped`}):n.signal.aborted?u(o?{kind:`timedOut`}:{kind:`aborted`}):u({kind:`error`,error:V(e)})}},m=e=>new Promise(t=>{if(e.aborted){t();return}e[n]?.();let i=()=>{a(),t()},a=()=>{e.removeEventListener(`abort`,i),r.signal.removeEventListener(`abort`,i)};e.addEventListener(`abort`,i,{once:!0}),r.signal.addEventListener(`abort`,i,{once:!0})}),h=e=>new Promise(t=>{if(r.signal.aborted){t();return}let n=()=>{clearTimeout(a),i(),t()},i=()=>r.signal.removeEventListener(`abort`,n),a=setTimeout(n,e);r.signal.addEventListener(`abort`,n,{once:!0})}),g=async()=>{let{defer:n,delay:i,retry:a,retryUntil:o}=t,s=e;if(s===void 0)return;if(r.signal.aborted||n!==void 0&&(await m(n),r.signal.aborted))return u(p(`Aborted`));if(o!==void 0){let e=o.signal;for(;;){if(r.signal.aborted)return u(p(`Aborted`));if(e.aborted)return u(p(`Stopped`));let t=new AbortController,n=await d(s,t,e);switch(n.kind){case`value`:return u(f(n.value));case`aborted`:return u(p(`Aborted`));case`stopped`:return u(p(`Stopped`));case`timedOut`:case`error`:if(r.signal.aborted)return u(p(`Aborted`));if(e.aborted)return u(p(`Stopped`));o.delay!==void 0&&await h(o.delay)}}}if(a!==void 0&&a>0){let e=a;for(;;){if(r.signal.aborted||(i!==void 0&&await h(i),r.signal.aborted))return u(p(`Aborted`));let t=new AbortController,n=await d(s,t,void 0);switch(n.kind){case`value`:return u(f(n.value));case`aborted`:return u(p(`Aborted`));case`timedOut`:return u(p(`Timed out`));case`stopped`:return u(p(`Stopped`));case`error`:if(e>0){--e;continue}return u(p(n.error))}}}if(i!==void 0&&await h(i),r.signal.aborted)return u(p(`Aborted`));let c=new AbortController,l=await d(s,c,void 0);switch(l.kind){case`value`:return u(f(l.value));case`aborted`:return u(p(`Aborted`));case`timedOut`:return u(p(`Timed out`));case`stopped`:return u(p(`Stopped`));case`error`:return u(p(l.error))}},_=()=>{c||(c=!0,e!==void 0&&g())};i[n]=_;let v={done:i,abort:()=>{r.abort(),u(p(`Aborted`))},resolve:e=>u(f(e)),reject:e=>u(p(V(e))),tap:e=>U(async()=>{let t=await v;return t.isOk&&await e(t.value),t}),then:(e,t)=>(_(),s.then(e,t)),catch:e=>(_(),s.catch(e)),finally:e=>(_(),s.finally(e))};return v}function W(e){let{type:t}=e;if(t===`race`&&e.count<1)throw Error(`superRunner race count must be at least 1`);let r=new AbortController,i=B(),a=()=>{},o=new Promise(e=>{a=e}),s=!1,c=!1,l=e=>{c||(c=!0,a(e),i.fire())},u=t===`sequence`?e.runners:Object.values(e.runners),d=()=>{for(let e of u)e.abort()},m=async e=>{let t=[];for(let n of e){if(r.signal.aborted)return l(p(`Aborted`));let e=await n;if(r.signal.aborted)return l(p(`Aborted`));if(e.isErr)return l(p(e.error));t.push(e.value)}l(f(t))},h=async e=>{let t=Object.entries(e),n={},i=0;for(let[e,a]of t)a.then(a=>{if(i+=1,a.isOk)n[e]=a.value;else if(!r.signal.aborted&&!c){d(),l(p(a.error));return}i===t.length&&l(f(n))});t.length===0&&l(f(n))},g=async(e,t)=>{let n=Object.entries(e),r={},i=0,a=0;for(let[e,o]of n)o.then(o=>{a+=1,o.isOk&&(r[e]=o.value,i+=1,i>=t)?(d(),l(f(r))):a===n.length&&l(p(i===0?`All runners failed`:`Not enough runners succeeded`))});n.length===0&&l(p(`All runners failed`))},_=()=>(s||(s=!0,t===`sequence`?m(e.runners):t===`all`?h(e.runners):g(e.runners,e.count)),o);return i[n]=_,{done:i,start:_,abort:()=>{r.abort(),d(),l(p(`Aborted`))}}}function G(){let e=/* @__PURE__ */ new Map,t=t=>{let n=e.get(t.topic);if(n!==void 0)for(let e of n)try{e(t)}catch(e){u(`channel subscriber threw:`,e)}};return{send:t,subscribe:(t,n)=>{let r=e.get(t.topic);return r===void 0&&(r=/* @__PURE__ */ new Set,e.set(t.topic,r)),r.add(n),()=>{let r=e.get(t.topic);r!==void 0&&r.delete(n)}},when:e=>{e.signal.aborted?t({topic:e.topic,data:e.data}):e.signal.addEventListener(`abort`,()=>t({topic:e.topic,data:e.data}),{once:!0})}}}export{p as Err,f as Ok,S as Options,D as _to,T as atom,G as createChannel,B as createSignal,m as isFalsy,O as match,A as matchAll,y as option,d as panic,z as pipe,u as println,F as safeTry,e as scheduleMicrotask,c as setEnvironment,U as superPromise,W as superRunner,P as unzip,M as zip,N as zipWith};
2
+ `);s?s(t):o!==`production`&&globalThis.console?.log?.(t)};function d(e){throw Error(e)}function f(t,n){let r=Object.freeze({type:`Ok`,value:t,...n===void 0?{}:{message:n},isOk:!0,isErr:!1}),i=e=>{try{let t=e(r.value);return t instanceof Promise?t.then(e=>e===void 0?a:f(e)).catch(e=>p(e instanceof Error?e.message:String(e))):t===void 0?a:f(t)}catch(e){return p(e instanceof Error?e.message:String(e))}},a={...r,expect:(e=>r.value),unwrap:(()=>(e(()=>{}),{else(e){return r.value}})),andThen:i};return a}function p(t){let n=Object.freeze({type:`Err`,error:t,isOk:!1,isErr:!0}),r=e=>i,i={...n,expect:(e=>{throw Error(e??t)}),unwrap:(()=>{let n=!1;return e(()=>{if(!n)throw Error(t)}),{else(e){return n=!0,typeof e==`function`?e(t):e}}}),andThen:r};return i}const m=e=>e==null||e===``||Number.isNaN(e)||e===1/0||e===-1/0;function h(e){if(m(e))throw Error(`Cannot wrap null, undefined, NaN, or empty string in Some`);return Object.freeze({type:`Some`,value:e,isSome:!0,isNone:!1})}const g=Object.freeze({type:`None`,isSome:!1,isNone:!0});let _=null;function v(e){_=e}function y(t){let n=m(t)?g:h(t),r=(e=>{if(!_)throw Error(`Converter not initialized`);return _(n,e)}),i=(e=>{if(n.isSome)return n.value;throw Error(e??`Expected Some, got None`)}),a=(()=>{let t=!1,r=n;return e(()=>{if(!t)throw Error(`Expected else`)}),{else(e){if(t=!0,r.isSome)return r.value;let n=typeof e==`function`?e(void 0):e;if(m(n))throw Error(`Fallback must be truthy`);return n}}}),o=(e=>{let t=n;if(t.isNone)return s;let r=t.value;try{let t=e(r);return t instanceof Promise?t.then(e=>e===void 0?s:y(e)).catch(()=>y(null)):t===void 0?s:y(t)}catch{return y(null)}}),s={...n,to:r,expect:i,unwrap:a,andThen:o};return s}const b=e=>{if(typeof e!=`object`||!e)return e;let t=e;return t.isSome===!0||t.isOk===!0?t.value:e},x=e=>{if(typeof e==`object`&&e){let t=e;if(t.isNone===!0||t.isErr===!0)return!0}return m(b(e))};function S(e,t=p(`No value!`)){for(let t of e)if(!x(t))return f(b(t));return t}let C=null;function w(e){C=e}function T(e){let t=Symbol(e),n=Object(t);return n.to=(e=>{if(!C)throw Error(`Converter not initialized`);return C(t,e)}),n.andThen=t=>{let r;try{r=t(e)}catch(e){d(`Atom.andThen: fn threw an error: ${e instanceof Error?e.message:String(e)}`)}return r===void 0?n:(typeof r!=`string`&&d(`Atom.andThen: fn must return a string, got ${typeof r}`),T(r))},n}const E=e=>typeof e==`object`&&!!e&&`isSome`in e&&`isNone`in e;function D(e,t){if(e&&(e.type===`Ok`||e.type===`Err`))throw Error(`Cannot convert a Result to any other type`);switch(t){case`option`:return E(e)?e:y(typeof e==`symbol`?e.description:e);case`atom`:if(E(e)){if(e.isNone)throw Error(`Cannot convert None to Atom`);if(typeof e.value!=`string`)throw Error(`Only string values can be converted to Atom`);return T(e.value)}if(typeof e==`symbol`)return e;throw Error(`Cannot convert type ${typeof e} to Atom`);case`result`:return E(e)?e.isSome?f(e.value):p(`Value is None`):f(typeof e==`symbol`?e.description:e);default:throw Error(`Invalid target: ${t}`)}}v(D),w(D);function O(e,t){let n=t[e.type];if(!n)throw Error(`Non-exhaustive match — missing handler for '${e.type}'`);return n(e)}const k=e=>typeof e==`string`||typeof e==`number`||typeof e==`boolean`||typeof e==`symbol`;function A(e,t){let n=e=>typeof e?.valueOf==`function`?e.valueOf():e,r=e=>typeof e==`symbol`?e.description:void 0,i=n(e);if(!k(i))throw Error(`Unsupported match all value type: ${typeof i}`);let a=r(i)??i,o=typeof a==`boolean`||typeof a==`number`?String(a):a;return o!=null&&o in t?t[o](e):t._()}function j(e,t=!1){if(!t&&!Array.isArray(e))throw Error(`Only arrays allowed when includeValues=false`);return Array.isArray(e)?e:e instanceof Set?Array.from(e):Object.values(e)}function M(e,t){let{fillValue:n,includeValues:r=!1}=t||{};if(e.length===0)return[];let i=e.map(e=>j(e,r)),a=Math.max(...i.map(e=>e.length)),o=Math.min(...i.map(e=>e.length)),s=n===void 0?o:a,c=[];for(let e=0;e<s;e++)c.push(i.map(t=>e<t.length?t[e]:n));return c}function N(e,t,n){return M(e,n).map(t)}function P(e){if(e.length===0)return[];let t=e[0]?.length??0,n=Array.from({length:t},()=>[]);for(let t of e)t.forEach((e,t)=>n[t]?.push(e));return n}async function F(e,n){let o=n?.throw??!1;try{let n=a(await e()),o=/* @__PURE__ */ new Set;for(;n.ok;){let e=n.value;if(!i(e)&&!t(e)&&!r(e))return f(e);if(typeof e==`object`&&e){if(o.has(e))return p(`Cannot resolve a circular value`);o.add(e)}n=a(e)}return p(n.error)}catch(e){let t=e instanceof Error?e.message:String(e);if(o)throw e instanceof Error?e:Error(t);return p(t)}}function I(e){return e.error??`Unknown error`}function L(e){let t=a(e);return t.ok?f(t.value):p(t.error)}async function R(e,n){try{let r=await e(n);return t(r)?r:p(`Pipeline function must return a Result`)}catch(e){return p(e instanceof Error?e.message:String(e))}}function z(e,...t){return{async run(n){let{onEach:r,onSuccess:i,onError:a,allowErrors:o=!1}=n??{},s=L(e);for(let e=0;e<t.length;e++){let n=t[e],i=t[e+1];if(s.isErr&&!o)return a?.(Error(I(s))),s;s=await R(n,s),r?.({prevResult:s,currentFn:n.name||`fn${e+1}`,nextFn:i?i.name||`fn${e+2}`:void 0})}return s.isOk?i?.(s.value):a?.(Error(I(s))),s}}}function B(){let e=new AbortController;return Object.assign(e.signal,{fire:()=>e.abort()})}const V=e=>e instanceof Error?e.message:String(e),H=(e,t)=>{if(e.aborted)return t.abort(),()=>{};let n=()=>t.abort();return e.addEventListener(`abort`,n,{once:!0}),()=>e.removeEventListener(`abort`,n)};function U(e,t={}){let r=new AbortController,i=B(),o=()=>{},s=new Promise(e=>{o=e}),c=!1,l=!1,u=e=>{l||(l=!0,o(e),i.fire())},d=async(e,n,i)=>{let o=!1,s,c=i===void 0?()=>{}:H(i,n),l=H(r.signal,n);t.timeout!==void 0&&(s=setTimeout(()=>{o=!0,n.abort()},t.timeout));let u=e=>(s!==void 0&&clearTimeout(s),c(),l(),e);try{let t=a(await e(n.signal));return n.signal.aborted?r.signal.aborted?u({kind:`aborted`}):i?.aborted?u({kind:`stopped`}):u(o?{kind:`timedOut`}:{kind:`aborted`}):t.ok?u({kind:`value`,value:t.value}):u({kind:`error`,error:t.error})}catch(e){return r.signal.aborted?u({kind:`aborted`}):i?.aborted?u({kind:`stopped`}):n.signal.aborted?u(o?{kind:`timedOut`}:{kind:`aborted`}):u({kind:`error`,error:V(e)})}},m=e=>new Promise(t=>{if(e.aborted){t();return}e[n]?.();let i=()=>{a(),t()},a=()=>{e.removeEventListener(`abort`,i),r.signal.removeEventListener(`abort`,i)};e.addEventListener(`abort`,i,{once:!0}),r.signal.addEventListener(`abort`,i,{once:!0})}),h=e=>new Promise(t=>{if(r.signal.aborted){t();return}let n=()=>{clearTimeout(a),i(),t()},i=()=>r.signal.removeEventListener(`abort`,n),a=setTimeout(n,e);r.signal.addEventListener(`abort`,n,{once:!0})}),g=async()=>{let{defer:n,delay:i,retry:a,retryUntil:o}=t,s=e;if(s===void 0)return;if(r.signal.aborted||n!==void 0&&(await m(n),r.signal.aborted))return u(p(`Aborted`));if(o!==void 0){let e=o.signal;for(;;){if(r.signal.aborted)return u(p(`Aborted`));if(e.aborted)return u(p(`Stopped`));let t=new AbortController,n=await d(s,t,e);switch(n.kind){case`value`:return u(f(n.value));case`aborted`:return u(p(`Aborted`));case`stopped`:return u(p(`Stopped`));case`timedOut`:case`error`:if(r.signal.aborted)return u(p(`Aborted`));if(e.aborted)return u(p(`Stopped`));o.delay!==void 0&&await h(o.delay)}}}if(a!==void 0&&a>0){let e=a;for(;;){if(r.signal.aborted||(i!==void 0&&await h(i),r.signal.aborted))return u(p(`Aborted`));let t=new AbortController,n=await d(s,t,void 0);switch(n.kind){case`value`:return u(f(n.value));case`aborted`:return u(p(`Aborted`));case`timedOut`:return u(p(`Timed out`));case`stopped`:return u(p(`Stopped`));case`error`:if(e>0){--e;continue}return u(p(n.error))}}}if(i!==void 0&&await h(i),r.signal.aborted)return u(p(`Aborted`));let c=new AbortController,l=await d(s,c,void 0);switch(l.kind){case`value`:return u(f(l.value));case`aborted`:return u(p(`Aborted`));case`timedOut`:return u(p(`Timed out`));case`stopped`:return u(p(`Stopped`));case`error`:return u(p(l.error))}},_=()=>{c||(c=!0,e!==void 0&&g())};i[n]=_;let v={done:i,abort:()=>{r.abort(),u(p(`Aborted`))},resolve:e=>u(f(e)),reject:e=>u(p(V(e))),tap:e=>U(async()=>{let t=await v;return t.isOk&&await e(t.value),t}),then:(e,t)=>(_(),s.then(e,t)),catch:e=>(_(),s.catch(e)),finally:e=>(_(),s.finally(e))};return v}function W(e){let{type:t}=e;if(t===`race`&&e.count<1)throw Error(`superRunner race count must be at least 1`);let r=new AbortController,i=B(),a=()=>{},o=new Promise(e=>{a=e}),s=!1,c=!1,l=e=>{c||(c=!0,a(e),i.fire())},u=t===`sequence`?e.runners:Object.values(e.runners),d=()=>{for(let e of u)e.abort()},m=async e=>{let t=[];for(let n of e){if(r.signal.aborted)return l(p(`Aborted`));let e=await n;if(r.signal.aborted)return l(p(`Aborted`));if(e.isErr)return l(p(e.error));t.push(e.value)}l(f(t))},h=async e=>{let t=Object.entries(e),n={},i=0;for(let[e,a]of t)a.then(a=>{if(i+=1,a.isOk)n[e]=a.value;else if(!r.signal.aborted&&!c){d(),l(p(a.error));return}i===t.length&&l(f(n))});t.length===0&&l(f(n))},g=async(e,t)=>{let n=Object.entries(e),r={},i=0,a=0;for(let[e,o]of n)o.then(o=>{a+=1,o.isOk&&(r[e]=o.value,i+=1,i>=t)?(d(),l(f(r))):a===n.length&&l(p(i===0?`All runners failed`:`Not enough runners succeeded`))});n.length===0&&l(p(`All runners failed`))},_=()=>(s||(s=!0,t===`sequence`?m(e.runners):t===`all`?h(e.runners):g(e.runners,e.count)),o);return i[n]=_,{done:i,start:_,abort:()=>{r.abort(),d(),l(p(`Aborted`))}}}function G(){let e=/* @__PURE__ */ new Map,t=t=>{let n=e.get(t.topic);if(n!==void 0)for(let e of n)try{e(t)}catch(e){u(`channel subscriber threw:`,e)}};return{send:t,subscribe:(t,n)=>{let r=e.get(t.topic);return r===void 0&&(r=/* @__PURE__ */ new Set,e.set(t.topic,r)),r.add(n),()=>{let r=e.get(t.topic);r!==void 0&&r.delete(n)}},when:e=>{e.signal.aborted?t({topic:e.topic,data:e.data}):e.signal.addEventListener(`abort`,()=>t({topic:e.topic,data:e.data}),{once:!0})}}}export{p as Err,f as Ok,S as Options,D as _to,T as atom,G as createChannel,B as createSignal,m as isFalsy,O as match,A as matchAll,y as option,d as panic,z as pipe,u as println,F as safeTry,e as scheduleMicrotask,c as setEnvironment,U as superPromise,W as superRunner,P as unzip,M as zip,N as zipWith};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "slang-ts",
3
- "version": "0.0.9",
3
+ "version": "0.1.1",
4
4
  "description": "Functional programming library for TypeScript: Option, Result, pattern matching, and async primitives",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -69,6 +69,7 @@
69
69
  "test:watch": "vitest",
70
70
  "test:ui": "vitest --ui",
71
71
  "typecheck": "tsc --noEmit",
72
- "build": "bun run test && bun run typecheck && tsdown"
72
+ "build": "tsdown",
73
+ "export": "bun run test && bun run typecheck && bun run build"
73
74
  }
74
75
  }