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 +16 -3
- package/dist/index.d.ts +6 -1
- package/dist/index.js +1 -1
- package/package.json +3 -2
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
|
|
688
|
+
Install project dependencies with Bun, then export:
|
|
676
689
|
|
|
677
690
|
```bash
|
|
678
691
|
bun install
|
|
679
|
-
bun run
|
|
692
|
+
bun run export
|
|
680
693
|
```
|
|
681
694
|
|
|
682
|
-
|
|
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.
|
|
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": "
|
|
72
|
+
"build": "tsdown",
|
|
73
|
+
"export": "bun run test && bun run typecheck && bun run build"
|
|
73
74
|
}
|
|
74
75
|
}
|