diff --git a/404.html b/404.html index d3c4ae2f..f6178779 100644 --- a/404.html +++ b/404.html @@ -3,15 +3,15 @@ -Page Not Found | Boxed - - - +Page Not Found | Boxed + + +
-
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..b63a72b7 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +boxed.cool \ No newline at end of file diff --git a/array/index.html b/array/index.html index a38dc2fb..ff141b5f 100644 --- a/array/index.html +++ b/array/index.html @@ -3,15 +3,15 @@ -Array | Boxed - - - +Array | Boxed + + +
-
Skip to main content

Array

import { Array } from "@swan-io/boxed";

Array.filterMap(array, func)

Returns an array containing the Option.Some values returned by func for each array item.

This function can be useful to refine the types of an array.

Examples
Array.filterMap([1, 2, 3], (x) =>
isEven(x) ? Option.Some(x) : Option.None(),
); // [2]

Array.findMap(array, func)

Returns the first Option.Some value returned by func for each array item.

Examples
Array.findMap([1, 2, 3], (x) =>
isEven(x) ? Option.Some(x) : Option.None(),
); // Option.Some(2)

Array.find(array, predicate)

Return the first item in the array for which predicate returns true.

The function returns an Option so that we can distinguish between a found nullish value and a not found value.

Examples
Array.find(array, (x) => x === undefined);
// Some(undefined) if found
// None if not found

Array.findIndex(array, predicate)

Return the first index in the array for which predicate returns true.

The function returns an Option.

Examples
Array.findIndex(array, (x) => x === undefined);
// Some(index) if found
// None if not found

Array.binarySearchBy(sortedArray, item, compare)

Performs a binary search on the array.

Returns the index of the item if there's an exact match, return the index of the first superior value if not. Return -1 if the array is empty.

Examples
const index = Array.binarySearchBy(array, "my value");

Array.zip(arrayA, arrayB)

Create an array of pairs from two arrays.

Examples
Array.zip([1, 2, 3], ["one", "two", "three"]);
// [[1, "one"], [2, "two"], [3, "three"]]

Array.unzip(arrayOfPairs)

Turns an array of pairs into two arrays.

Examples
Array.unzip([
[1, "one"],
[2, "two"],
[3, "three"],
]);
// [[1, 2, 3], ["one", "two", "three"]]

Array.from(arrayLike)

Array.from, reexported for convenience when Boxed Array shadows the Array constructor in scope.

Examples
Array.from({ length: 3 }, (_, key) => key); // [0, 1, 2]

Array.of(...items)

Array.of, reexported for convenience when Boxed Array shadows the Array constructor in scope.

Examples
Array.of(1, 2, 3); // [1, 2, 3]

Array.isArray(value)

Array.isArray, reexported for convenience when Boxed Array shadows the Array constructor in scope.

Examples
Array.isArray("");
// false

Array.isArray([1, 2, 3]);
// true
- - +
Skip to main content

Array

import { Array } from "@swan-io/boxed";

Array.filterMap(array, func)

Returns an array containing the Option.Some values returned by func for each array item.

This function can be useful to refine the types of an array.

Examples
Array.filterMap([1, 2, 3], (x) =>
isEven(x) ? Option.Some(x) : Option.None(),
); // [2]

Array.findMap(array, func)

Returns the first Option.Some value returned by func for each array item.

Examples
Array.findMap([1, 2, 3], (x) =>
isEven(x) ? Option.Some(x) : Option.None(),
); // Option.Some(2)

Array.find(array, predicate)

Return the first item in the array for which predicate returns true.

The function returns an Option so that we can distinguish between a found nullish value and a not found value.

Examples
Array.find(array, (x) => x === undefined);
// Some(undefined) if found
// None if not found

Array.findIndex(array, predicate)

Return the first index in the array for which predicate returns true.

The function returns an Option.

Examples
Array.findIndex(array, (x) => x === undefined);
// Some(index) if found
// None if not found

Array.binarySearchBy(sortedArray, item, compare)

Performs a binary search on the array.

Returns the index of the item if there's an exact match, return the index of the first superior value if not. Return -1 if the array is empty.

Examples
const index = Array.binarySearchBy(array, "my value");

Array.zip(arrayA, arrayB)

Create an array of pairs from two arrays.

Examples
Array.zip([1, 2, 3], ["one", "two", "three"]);
// [[1, "one"], [2, "two"], [3, "three"]]

Array.unzip(arrayOfPairs)

Turns an array of pairs into two arrays.

Examples
Array.unzip([
[1, "one"],
[2, "two"],
[3, "three"],
]);
// [[1, 2, 3], ["one", "two", "three"]]

Array.from(arrayLike)

Array.from, reexported for convenience when Boxed Array shadows the Array constructor in scope.

Examples
Array.from({ length: 3 }, (_, key) => key); // [0, 1, 2]

Array.of(...items)

Array.of, reexported for convenience when Boxed Array shadows the Array constructor in scope.

Examples
Array.of(1, 2, 3); // [1, 2, 3]

Array.isArray(value)

Array.isArray, reexported for convenience when Boxed Array shadows the Array constructor in scope.

Examples
Array.isArray("");
// false

Array.isArray([1, 2, 3]);
// true
+ + \ No newline at end of file diff --git a/assets/js/23d1b9e9.434a8022.js b/assets/js/23d1b9e9.dfd463fe.js similarity index 62% rename from assets/js/23d1b9e9.434a8022.js rename to assets/js/23d1b9e9.dfd463fe.js index 7c9727d8..f51d4c0f 100644 --- a/assets/js/23d1b9e9.434a8022.js +++ b/assets/js/23d1b9e9.dfd463fe.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[382],{3905:(e,r,t)=>{t.d(r,{Zo:()=>p,kt:()=>d});var n=t(7294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function c(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function a(e){for(var r=1;r=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var u=n.createContext({}),l=function(e){var r=n.useContext(u),t=r;return e&&(t="function"==typeof e?e(r):a(a({},r),e)),t},p=function(e){var r=l(e.components);return n.createElement(u.Provider,{value:r},e.children)},s="mdxType",y={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},m=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,c=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=l(t),m=o,d=s["".concat(u,".").concat(m)]||s[m]||y[m]||c;return t?n.createElement(d,a(a({ref:r},p),{},{components:t})):n.createElement(d,a({ref:r},p))}));function d(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var c=t.length,a=new Array(c);a[0]=m;var i={};for(var u in r)hasOwnProperty.call(r,u)&&(i[u]=r[u]);i.originalType=e,i[s]="string"==typeof e?e:o,a[1]=i;for(var l=2;l{t.r(r),t.d(r,{assets:()=>u,contentTitle:()=>a,default:()=>y,frontMatter:()=>c,metadata:()=>i,toc:()=>l});var n=t(7462),o=(t(7294),t(3905));const c={title:"Concurrency",sidebar_label:"Concurrency"},a=void 0,i={unversionedId:"concurrency",id:"concurrency",title:"Concurrency",description:"While you have a simple Future.all to run all futures in parallel (like Promise.all does), you might want to limit the concurrency at which you execute operations.",source:"@site/docs/concurrency.md",sourceDirName:".",slug:"/concurrency",permalink:"/boxed/concurrency",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/concurrency.md",tags:[],version:"current",frontMatter:{title:"Concurrency",sidebar_label:"Concurrency"},sidebar:"docs",previous:{title:"Retry",permalink:"/boxed/retry"},next:{title:"Inspirations",permalink:"/boxed/inspirations"}},u={},l=[],p={toc:l},s="wrapper";function y(e){let{components:r,...t}=e;return(0,o.kt)(s,(0,n.Z)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"While you have a simple ",(0,o.kt)("inlineCode",{parentName:"p"},"Future.all")," to run all futures in parallel (like ",(0,o.kt)("inlineCode",{parentName:"p"},"Promise.all")," does), you might want to limit the concurrency at which you execute operations."),(0,o.kt)("p",null,"Using ",(0,o.kt)("inlineCode",{parentName:"p"},"Future.concurrent"),", you can specify the maximum concurrency for your array of operations."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"Future.concurrent(\n userIds.map((userId) => {\n // notice we return a function\n return () => getUserById(userId);\n }),\n { concurrency: 10 },\n);\n")))}y.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[382],{3905:(e,r,t)=>{t.d(r,{Zo:()=>p,kt:()=>f});var n=t(7294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function c(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function a(e){for(var r=1;r=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var u=n.createContext({}),l=function(e){var r=n.useContext(u),t=r;return e&&(t="function"==typeof e?e(r):a(a({},r),e)),t},p=function(e){var r=l(e.components);return n.createElement(u.Provider,{value:r},e.children)},s="mdxType",y={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},m=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,c=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=l(t),m=o,f=s["".concat(u,".").concat(m)]||s[m]||y[m]||c;return t?n.createElement(f,a(a({ref:r},p),{},{components:t})):n.createElement(f,a({ref:r},p))}));function f(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var c=t.length,a=new Array(c);a[0]=m;var i={};for(var u in r)hasOwnProperty.call(r,u)&&(i[u]=r[u]);i.originalType=e,i[s]="string"==typeof e?e:o,a[1]=i;for(var l=2;l{t.r(r),t.d(r,{assets:()=>u,contentTitle:()=>a,default:()=>y,frontMatter:()=>c,metadata:()=>i,toc:()=>l});var n=t(7462),o=(t(7294),t(3905));const c={title:"Concurrency",sidebar_label:"Concurrency"},a=void 0,i={unversionedId:"concurrency",id:"concurrency",title:"Concurrency",description:"While you have a simple Future.all to run all futures in parallel (like Promise.all does), you might want to limit the concurrency at which you execute operations.",source:"@site/docs/concurrency.md",sourceDirName:".",slug:"/concurrency",permalink:"/concurrency",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/concurrency.md",tags:[],version:"current",frontMatter:{title:"Concurrency",sidebar_label:"Concurrency"},sidebar:"docs",previous:{title:"Retry",permalink:"/retry"},next:{title:"Inspirations",permalink:"/inspirations"}},u={},l=[],p={toc:l},s="wrapper";function y(e){let{components:r,...t}=e;return(0,o.kt)(s,(0,n.Z)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"While you have a simple ",(0,o.kt)("inlineCode",{parentName:"p"},"Future.all")," to run all futures in parallel (like ",(0,o.kt)("inlineCode",{parentName:"p"},"Promise.all")," does), you might want to limit the concurrency at which you execute operations."),(0,o.kt)("p",null,"Using ",(0,o.kt)("inlineCode",{parentName:"p"},"Future.concurrent"),", you can specify the maximum concurrency for your array of operations."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"Future.concurrent(\n userIds.map((userId) => {\n // notice we return a function\n return () => getUserById(userId);\n }),\n { concurrency: 10 },\n);\n")))}y.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/28b9547a.8b9149cd.js b/assets/js/28b9547a.8b9149cd.js deleted file mode 100644 index 18464205..00000000 --- a/assets/js/28b9547a.8b9149cd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[498],{3905:(e,t,r)=>{r.d(t,{Zo:()=>k,kt:()=>N});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function u(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var i=a.createContext({}),o=function(e){var t=a.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):u(u({},t),e)),r},k=function(e){var t=o(e.components);return a.createElement(i.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,i=e.parentName,k=p(e,["components","mdxType","originalType","parentName"]),m=o(r),d=n,N=m["".concat(i,".").concat(d)]||m[d]||s[d]||l;return r?a.createElement(N,u(u({ref:t},k),{},{components:r})):a.createElement(N,u({ref:t},k))}));function N(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,u=new Array(l);u[0]=d;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p[m]="string"==typeof e?e:n,u[1]=p;for(var o=2;o{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>u,default:()=>s,frontMatter:()=>l,metadata:()=>p,toc:()=>o});var a=r(7462),n=(r(7294),r(3905));const l={title:"Future>",sidebar_label:"Future helpers"},u=void 0,p={unversionedId:"future-result",id:"future-result",title:"Future>",description:"A Future can contain a Result (e.g. to represent an asynchronous value that can fail). We provide some utility functions to deal with that case without having to unwrap the Future result.",source:"@site/docs/future-result.md",sourceDirName:".",slug:"/future-result",permalink:"/boxed/future-result",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/future-result.md",tags:[],version:"current",frontMatter:{title:"Future>",sidebar_label:"Future helpers"},sidebar:"docs",previous:{title:"Future",permalink:"/boxed/future"},next:{title:"Deferred",permalink:"/boxed/deferred"}},i={},o=[{value:"Methods",id:"methods",level:2},{value:".mapOkToResult(f)",id:"mapoktoresultf",level:3},{value:".mapErrorToResult(f)",id:"maperrortoresultf",level:3},{value:".mapOk(f)",id:"mapokf",level:3},{value:".mapError(f)",id:"maperrorf",level:3},{value:".flatMapOk(f)",id:"flatmapokf",level:3},{value:".flatMapError(f)",id:"flatmaperrorf",level:3},{value:".tapOk(f)",id:"tapokf",level:3},{value:".tapError(f)",id:"taperrorf",level:3},{value:".resultToPromise()",id:"resulttopromise",level:3},{value:"Statics",id:"statics",level:2},{value:"Future.all(resultFutures)",id:"futureallresultfutures",level:3},{value:"Future.allFromDict(resultFutures)",id:"futureallfromdictresultfutures",level:3},{value:"Future.retry(getFuture)",id:"futureretrygetfuture",level:3},{value:"Cheatsheet",id:"cheatsheet",level:2}],k={toc:o},m="wrapper";function s(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},k,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"A ",(0,n.kt)("a",{parentName:"p",href:"./future"},"Future")," can contain a ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")," (e.g. to represent an asynchronous value that can fail). We provide some utility functions to deal with that case without having to unwrap the Future result."),(0,n.kt)("admonition",{type:"note"},(0,n.kt)("p",{parentName:"admonition"},"You can still use all the regular ",(0,n.kt)("a",{parentName:"p",href:"./future"},"Future")," methods. The following helpers simply removes the need to unwrap the contained result.")),(0,n.kt)("h2",{id:"methods"},"Methods"),(0,n.kt)("h3",{id:"mapoktoresultf"},".mapOkToResult(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.mapOkToResult(\n func: (value: A) => Result,\n propagateCancel?: boolean\n): Future>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and a ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok")," and returning ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")," and returns a new ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.value(Result.Ok(3)).mapOkToResult((ok) => {\n return Result.Ok(ok * 2);\n});\n// Future>\n\nFuture.value(Result.Ok(3)).mapOkToResult((ok) =>\n isEven(ok) ? Result.Ok(ok) : Result.Error("Odd number");\n);\n// Future>\n')),(0,n.kt)("h3",{id:"maperrortoresultf"},".mapErrorToResult(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.mapErrorToResult(\n func: (value: E) => Result,\n propagateCancel?: boolean\n): Future>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and a ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," and returning ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")," and returns a new ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.value(Result.Error(3)).mapErrorToResult((ok) => {\n return Result.Ok(ok * 2);\n});\n// Future>\n\nFuture.value(Result.Error(3)).mapErrorToResult((ok) =>\n isEven(ok) ? Result.Ok(ok) : Result.Error("Odd number");\n);\n// Future>\n')),(0,n.kt)("h3",{id:"mapokf"},".mapOk(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.mapOk(\n func: (value: A) => B,\n propagateCancel?: boolean\n): Future>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and a ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok")," and returning ",(0,n.kt)("inlineCode",{parentName:"p"},"ReturnValue")," and returns a new ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.value(Result.Ok(3)).mapOk((ok) => {\n return ok * 2;\n});\n// Future>\n\nFuture.value(Result.Error("something")).mapOk((ok) => {\n return ok * 2;\n});\n// Future>\n')),(0,n.kt)("h3",{id:"maperrorf"},".mapError(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.mapError(\n func: (value: E) => F,\n propagateCancel?: boolean\n): Future>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and a ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," and returning ",(0,n.kt)("inlineCode",{parentName:"p"},"ReturnValue")," and returns a new ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.value(Result.Error(3)).mapError((error) => {\n return error * 2;\n});\n// Future>\n\nFuture.value(Result.Ok("something")).mapError((ok) => {\n return ok * 2;\n});\n// Future>\n')),(0,n.kt)("h3",{id:"flatmapokf"},".flatMapOk(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.flatMapOk(\n func: (value: A) => Future>,\n propagateCancel?: boolean\n): Future>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and a ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok")," returning a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.value(Result.Ok(3)).flatMapOk((ok) => Future.value(Result.Ok(ok * 2)));\n// Future>\n\nFuture.value(Result.Ok(3)).flatMapOk((ok) =>\n Future.value(Result.Error("Nope")),\n);\n// Future>\n\nFuture.value(Result.Error("Error")).flatMapOk((ok) =>\n Future.value(Result.Ok(ok * 2)),\n);\n// Future>\n')),(0,n.kt)("h3",{id:"flatmaperrorf"},".flatMapError(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.flatMapError(\n func: (value: E) => Future>,\n propagateCancel?: boolean\n): Future>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and a ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," returning a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.value(Result.Ok(3)).flatMapError((error) =>\n Future.value(Result.Ok(ok * 2)),\n);\n// Future>\n\nFuture.value(Result.Error("Error")).flatMapError((error) =>\n Future.value(Result.Error("Nope")),\n);\n// Future>\n\nFuture.value(Result.Error("Error")).flatMapError((error) =>\n Future.value(Result.Ok(1)),\n);\n// Future>\n')),(0,n.kt)("h3",{id:"tapokf"},".tapOk(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.tapOk(func: (value: A) => unknown): Future>\n")),(0,n.kt)("p",null,"Runs ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," if value is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok")," with the future value, and returns the original future. Useful for debugging."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"future.tapOk(console.log);\n")),(0,n.kt)("h3",{id:"taperrorf"},".tapError(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.tapError(func: (value: E) => unknown): Future>\n")),(0,n.kt)("p",null,"Runs ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," if value is ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," with the future value, and returns the original future. Useful for debugging."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"future.tapError(console.log);\n")),(0,n.kt)("h3",{id:"resulttopromise"},".resultToPromise()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.resultToPromise(): Promise\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and returns a ",(0,n.kt)("inlineCode",{parentName:"p"},"Promise"),", rejecting the promise with ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," in this state."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.value(Result.Ok(1)).resultToPromise();\n// Promise<1>\n\nFuture.value(Result.Reject(1)).resultToPromise();\n// Promise (rejected with 1)\n")),(0,n.kt)("h2",{id:"statics"},"Statics"),(0,n.kt)("h3",{id:"futureallresultfutures"},"Future.all(resultFutures)"),(0,n.kt)("p",null,"You can combine the ",(0,n.kt)("inlineCode",{parentName:"p"},"all")," helpers from ",(0,n.kt)("inlineCode",{parentName:"p"},"Future")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"Result"),":"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const futures = [\n Future.value(Result.Ok(1)),\n Future.value(Result.Ok(2)),\n Future.value(Result.Ok(3)),\n];\n\nFuture.all(futures).map(Result.all);\n// Future>\n")),(0,n.kt)("p",null,"Let's see the types at each step:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"// Array>>\n// -> [Future>, Future>, Future>]\nconst input = [\n Future.value(Result.Ok(1)),\n Future.value(Result.Ok(2)),\n Future.value(Result.Ok(3)),\n];\n\n// Future>>\n// -> Future<[Result.Ok<1>>, Result.Ok<2>>, Result.Ok<3>]>\nconst step1 = Future.all(input);\n\n// Future, never>>\n// -> Future<[Result.Ok<[1, 2, 3]>>\nconst step2 = step1.map(Result.all);\n")),(0,n.kt)("h3",{id:"futureallfromdictresultfutures"},"Future.allFromDict(resultFutures)"),(0,n.kt)("p",null,"Like as ",(0,n.kt)("inlineCode",{parentName:"p"},"all"),", you can combine the ",(0,n.kt)("inlineCode",{parentName:"p"},"allFromDict"),":"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const futures = {\n a: Future.value(Result.Ok(1)),\n b: Future.value(Result.Ok(2)),\n c: Future.value(Result.Ok(3)),\n};\n\nFuture.allFromDict(futures).map(Result.allFromDict);\n// Future<[Result.Ok<{a: 1, b: 2, c: 3}>>\n")),(0,n.kt)("p",null,"Let's see the types at each step:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"// Dict>>\n// -> {a: Future>, b: Future>, c: Future>\u2014\nconst input = {\n a: Future.value(Result.Ok(1)),\n b: Future.value(Result.Ok(2)),\n c: Future.value(Result.Ok(3)),\n};\n\n// Future>>\n// -> Future<{a: Result.Ok<1>>, b: Result.Ok<2>>, c: Result.Ok<3>}>\nconst step1 = Future.all(input);\n\n// Future, never>>\n// -> Future<[Result.Ok<{a: 1, b: 2, c: 3}>>\nconst step2 = step1.map(Result.all);\n")),(0,n.kt)("h3",{id:"futureretrygetfuture"},"Future.retry(getFuture)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"retry(getFuture: () => Future>, {max: number}): Future>\n")),(0,n.kt)("p",null,"Runs the future getter, if the future resolves with a ",(0,n.kt)("inlineCode",{parentName:"p"},"Result.Error"),", retries until hitting ",(0,n.kt)("inlineCode",{parentName:"p"},"max")," attempts."),(0,n.kt)("p",null,"The function provides a 0-based ",(0,n.kt)("inlineCode",{parentName:"p"},"attempt")," count to the function if you need to implement delay logic."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"// retry immediately after failure\nFuture.retry(\n (attempt) => {\n return getUserById(userId);\n },\n { max: 3 },\n);\n// Future>\n\n// adding delay\nFuture.retry(\n (attempt) => {\n return Future.wait(attempt * 100).flatMap(() => getUserById(userId));\n },\n { max: 10 },\n);\n// Future>\n")),(0,n.kt)("h2",{id:"cheatsheet"},"Cheatsheet"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Method"),(0,n.kt)("th",{parentName:"tr",align:null},"Input"),(0,n.kt)("th",{parentName:"tr",align:null},"Function input"),(0,n.kt)("th",{parentName:"tr",align:null},"Function output"),(0,n.kt)("th",{parentName:"tr",align:null},"Returned value"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapoktoresultf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapOkToResult"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapoktoresultf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapOkToResult"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapoktoresultf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapOkToResult"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrortoresultf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapErrorToResult"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrortoresultf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapErrorToResult"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrortoresultf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapErrorToResult"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapokf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapOk"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"y")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapokf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapOk"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"f")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmapokf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapOk"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmapokf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapOk"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmapokf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapOk"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))"))))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/28b9547a.dad23265.js b/assets/js/28b9547a.dad23265.js new file mode 100644 index 00000000..6e1d6ec9 --- /dev/null +++ b/assets/js/28b9547a.dad23265.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[498],{3905:(e,t,r)=>{r.d(t,{Zo:()=>k,kt:()=>N});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function u(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var i=a.createContext({}),o=function(e){var t=a.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):u(u({},t),e)),r},k=function(e){var t=o(e.components);return a.createElement(i.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,i=e.parentName,k=p(e,["components","mdxType","originalType","parentName"]),m=o(r),d=n,N=m["".concat(i,".").concat(d)]||m[d]||s[d]||l;return r?a.createElement(N,u(u({ref:t},k),{},{components:r})):a.createElement(N,u({ref:t},k))}));function N(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,u=new Array(l);u[0]=d;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p[m]="string"==typeof e?e:n,u[1]=p;for(var o=2;o{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>u,default:()=>s,frontMatter:()=>l,metadata:()=>p,toc:()=>o});var a=r(7462),n=(r(7294),r(3905));const l={title:"Future>",sidebar_label:"Future helpers"},u=void 0,p={unversionedId:"future-result",id:"future-result",title:"Future>",description:"A Future can contain a Result (e.g. to represent an asynchronous value that can fail). We provide some utility functions to deal with that case without having to unwrap the Future result.",source:"@site/docs/future-result.md",sourceDirName:".",slug:"/future-result",permalink:"/future-result",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/future-result.md",tags:[],version:"current",frontMatter:{title:"Future>",sidebar_label:"Future helpers"},sidebar:"docs",previous:{title:"Future",permalink:"/future"},next:{title:"Deferred",permalink:"/deferred"}},i={},o=[{value:"Methods",id:"methods",level:2},{value:".mapOkToResult(f)",id:"mapoktoresultf",level:3},{value:".mapErrorToResult(f)",id:"maperrortoresultf",level:3},{value:".mapOk(f)",id:"mapokf",level:3},{value:".mapError(f)",id:"maperrorf",level:3},{value:".flatMapOk(f)",id:"flatmapokf",level:3},{value:".flatMapError(f)",id:"flatmaperrorf",level:3},{value:".tapOk(f)",id:"tapokf",level:3},{value:".tapError(f)",id:"taperrorf",level:3},{value:".resultToPromise()",id:"resulttopromise",level:3},{value:"Statics",id:"statics",level:2},{value:"Future.all(resultFutures)",id:"futureallresultfutures",level:3},{value:"Future.allFromDict(resultFutures)",id:"futureallfromdictresultfutures",level:3},{value:"Future.retry(getFuture)",id:"futureretrygetfuture",level:3},{value:"Cheatsheet",id:"cheatsheet",level:2}],k={toc:o},m="wrapper";function s(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},k,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"A ",(0,n.kt)("a",{parentName:"p",href:"./future"},"Future")," can contain a ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")," (e.g. to represent an asynchronous value that can fail). We provide some utility functions to deal with that case without having to unwrap the Future result."),(0,n.kt)("admonition",{type:"note"},(0,n.kt)("p",{parentName:"admonition"},"You can still use all the regular ",(0,n.kt)("a",{parentName:"p",href:"./future"},"Future")," methods. The following helpers simply removes the need to unwrap the contained result.")),(0,n.kt)("h2",{id:"methods"},"Methods"),(0,n.kt)("h3",{id:"mapoktoresultf"},".mapOkToResult(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.mapOkToResult(\n func: (value: A) => Result,\n propagateCancel?: boolean\n): Future>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and a ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok")," and returning ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")," and returns a new ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.value(Result.Ok(3)).mapOkToResult((ok) => {\n return Result.Ok(ok * 2);\n});\n// Future>\n\nFuture.value(Result.Ok(3)).mapOkToResult((ok) =>\n isEven(ok) ? Result.Ok(ok) : Result.Error("Odd number");\n);\n// Future>\n')),(0,n.kt)("h3",{id:"maperrortoresultf"},".mapErrorToResult(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.mapErrorToResult(\n func: (value: E) => Result,\n propagateCancel?: boolean\n): Future>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and a ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," and returning ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")," and returns a new ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.value(Result.Error(3)).mapErrorToResult((ok) => {\n return Result.Ok(ok * 2);\n});\n// Future>\n\nFuture.value(Result.Error(3)).mapErrorToResult((ok) =>\n isEven(ok) ? Result.Ok(ok) : Result.Error("Odd number");\n);\n// Future>\n')),(0,n.kt)("h3",{id:"mapokf"},".mapOk(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.mapOk(\n func: (value: A) => B,\n propagateCancel?: boolean\n): Future>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and a ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok")," and returning ",(0,n.kt)("inlineCode",{parentName:"p"},"ReturnValue")," and returns a new ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.value(Result.Ok(3)).mapOk((ok) => {\n return ok * 2;\n});\n// Future>\n\nFuture.value(Result.Error("something")).mapOk((ok) => {\n return ok * 2;\n});\n// Future>\n')),(0,n.kt)("h3",{id:"maperrorf"},".mapError(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.mapError(\n func: (value: E) => F,\n propagateCancel?: boolean\n): Future>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and a ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," and returning ",(0,n.kt)("inlineCode",{parentName:"p"},"ReturnValue")," and returns a new ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.value(Result.Error(3)).mapError((error) => {\n return error * 2;\n});\n// Future>\n\nFuture.value(Result.Ok("something")).mapError((ok) => {\n return ok * 2;\n});\n// Future>\n')),(0,n.kt)("h3",{id:"flatmapokf"},".flatMapOk(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.flatMapOk(\n func: (value: A) => Future>,\n propagateCancel?: boolean\n): Future>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and a ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok")," returning a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.value(Result.Ok(3)).flatMapOk((ok) => Future.value(Result.Ok(ok * 2)));\n// Future>\n\nFuture.value(Result.Ok(3)).flatMapOk((ok) =>\n Future.value(Result.Error("Nope")),\n);\n// Future>\n\nFuture.value(Result.Error("Error")).flatMapOk((ok) =>\n Future.value(Result.Ok(ok * 2)),\n);\n// Future>\n')),(0,n.kt)("h3",{id:"flatmaperrorf"},".flatMapError(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.flatMapError(\n func: (value: E) => Future>,\n propagateCancel?: boolean\n): Future>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and a ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," returning a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.value(Result.Ok(3)).flatMapError((error) =>\n Future.value(Result.Ok(ok * 2)),\n);\n// Future>\n\nFuture.value(Result.Error("Error")).flatMapError((error) =>\n Future.value(Result.Error("Nope")),\n);\n// Future>\n\nFuture.value(Result.Error("Error")).flatMapError((error) =>\n Future.value(Result.Ok(1)),\n);\n// Future>\n')),(0,n.kt)("h3",{id:"tapokf"},".tapOk(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.tapOk(func: (value: A) => unknown): Future>\n")),(0,n.kt)("p",null,"Runs ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," if value is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok")," with the future value, and returns the original future. Useful for debugging."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"future.tapOk(console.log);\n")),(0,n.kt)("h3",{id:"taperrorf"},".tapError(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.tapError(func: (value: E) => unknown): Future>\n")),(0,n.kt)("p",null,"Runs ",(0,n.kt)("inlineCode",{parentName:"p"},"f")," if value is ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," with the future value, and returns the original future. Useful for debugging."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"future.tapError(console.log);\n")),(0,n.kt)("h3",{id:"resulttopromise"},".resultToPromise()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Future>.resultToPromise(): Promise\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Future>")," and returns a ",(0,n.kt)("inlineCode",{parentName:"p"},"Promise"),", rejecting the promise with ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," in this state."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.value(Result.Ok(1)).resultToPromise();\n// Promise<1>\n\nFuture.value(Result.Reject(1)).resultToPromise();\n// Promise (rejected with 1)\n")),(0,n.kt)("h2",{id:"statics"},"Statics"),(0,n.kt)("h3",{id:"futureallresultfutures"},"Future.all(resultFutures)"),(0,n.kt)("p",null,"You can combine the ",(0,n.kt)("inlineCode",{parentName:"p"},"all")," helpers from ",(0,n.kt)("inlineCode",{parentName:"p"},"Future")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"Result"),":"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const futures = [\n Future.value(Result.Ok(1)),\n Future.value(Result.Ok(2)),\n Future.value(Result.Ok(3)),\n];\n\nFuture.all(futures).map(Result.all);\n// Future>\n")),(0,n.kt)("p",null,"Let's see the types at each step:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"// Array>>\n// -> [Future>, Future>, Future>]\nconst input = [\n Future.value(Result.Ok(1)),\n Future.value(Result.Ok(2)),\n Future.value(Result.Ok(3)),\n];\n\n// Future>>\n// -> Future<[Result.Ok<1>>, Result.Ok<2>>, Result.Ok<3>]>\nconst step1 = Future.all(input);\n\n// Future, never>>\n// -> Future<[Result.Ok<[1, 2, 3]>>\nconst step2 = step1.map(Result.all);\n")),(0,n.kt)("h3",{id:"futureallfromdictresultfutures"},"Future.allFromDict(resultFutures)"),(0,n.kt)("p",null,"Like as ",(0,n.kt)("inlineCode",{parentName:"p"},"all"),", you can combine the ",(0,n.kt)("inlineCode",{parentName:"p"},"allFromDict"),":"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const futures = {\n a: Future.value(Result.Ok(1)),\n b: Future.value(Result.Ok(2)),\n c: Future.value(Result.Ok(3)),\n};\n\nFuture.allFromDict(futures).map(Result.allFromDict);\n// Future<[Result.Ok<{a: 1, b: 2, c: 3}>>\n")),(0,n.kt)("p",null,"Let's see the types at each step:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"// Dict>>\n// -> {a: Future>, b: Future>, c: Future>\u2014\nconst input = {\n a: Future.value(Result.Ok(1)),\n b: Future.value(Result.Ok(2)),\n c: Future.value(Result.Ok(3)),\n};\n\n// Future>>\n// -> Future<{a: Result.Ok<1>>, b: Result.Ok<2>>, c: Result.Ok<3>}>\nconst step1 = Future.all(input);\n\n// Future, never>>\n// -> Future<[Result.Ok<{a: 1, b: 2, c: 3}>>\nconst step2 = step1.map(Result.all);\n")),(0,n.kt)("h3",{id:"futureretrygetfuture"},"Future.retry(getFuture)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"retry(getFuture: () => Future>, {max: number}): Future>\n")),(0,n.kt)("p",null,"Runs the future getter, if the future resolves with a ",(0,n.kt)("inlineCode",{parentName:"p"},"Result.Error"),", retries until hitting ",(0,n.kt)("inlineCode",{parentName:"p"},"max")," attempts."),(0,n.kt)("p",null,"The function provides a 0-based ",(0,n.kt)("inlineCode",{parentName:"p"},"attempt")," count to the function if you need to implement delay logic."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"// retry immediately after failure\nFuture.retry(\n (attempt) => {\n return getUserById(userId);\n },\n { max: 3 },\n);\n// Future>\n\n// adding delay\nFuture.retry(\n (attempt) => {\n return Future.wait(attempt * 100).flatMap(() => getUserById(userId));\n },\n { max: 10 },\n);\n// Future>\n")),(0,n.kt)("h2",{id:"cheatsheet"},"Cheatsheet"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Method"),(0,n.kt)("th",{parentName:"tr",align:null},"Input"),(0,n.kt)("th",{parentName:"tr",align:null},"Function input"),(0,n.kt)("th",{parentName:"tr",align:null},"Function output"),(0,n.kt)("th",{parentName:"tr",align:null},"Returned value"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapoktoresultf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapOkToResult"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapoktoresultf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapOkToResult"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapoktoresultf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapOkToResult"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrortoresultf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapErrorToResult"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrortoresultf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapErrorToResult"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrortoresultf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapErrorToResult"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapokf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapOk"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"y")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapokf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapOk"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"f")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmapokf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapOk"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmapokf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapOk"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmapokf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapOk"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(x))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Ok(y))"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(e))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Future(Error(f))"))))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3b8c55ea.6aee7597.js b/assets/js/3b8c55ea.35f0e30c.js similarity index 67% rename from assets/js/3b8c55ea.6aee7597.js rename to assets/js/3b8c55ea.35f0e30c.js index 42407711..622e6150 100644 --- a/assets/js/3b8c55ea.6aee7597.js +++ b/assets/js/3b8c55ea.35f0e30c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[217],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(n),f=o,m=u["".concat(s,".").concat(f)]||u[f]||d[f]||a;return n?r.createElement(m,i(i({ref:t},p),{},{components:n})):r.createElement(m,i({ref:t},p))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=f;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var r=n(7462),o=(n(7294),n(3905));const a={title:"Installation",sidebar_label:"Installation"},i=void 0,l={unversionedId:"installation",id:"installation",title:"Installation",description:"Prerequisites",source:"@site/docs/installation.md",sourceDirName:".",slug:"/installation",permalink:"/boxed/installation",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/installation.md",tags:[],version:"current",frontMatter:{title:"Installation",sidebar_label:"Installation"},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/boxed/core-concepts"},next:{title:"Design choices",permalink:"/boxed/design-choices"}},s={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installation",id:"installation",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"prerequisites"},"Prerequisites"),(0,o.kt)("p",null,"Even though you can use Boxed without TypeScript and still leverage some benefits, we recommend to use it to get all of the benefits Boxed can provide."),(0,o.kt)("h2",{id:"installation"},"Installation"),(0,o.kt)("p",null,"In your console"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-console"},"$ yarn add @swan-io/boxed\n")),(0,o.kt)("p",null,"or"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-console"},"$ npm install @swan-io/boxed\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[217],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(n),f=o,m=u["".concat(s,".").concat(f)]||u[f]||d[f]||a;return n?r.createElement(m,i(i({ref:t},p),{},{components:n})):r.createElement(m,i({ref:t},p))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=f;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var r=n(7462),o=(n(7294),n(3905));const a={title:"Installation",sidebar_label:"Installation"},i=void 0,l={unversionedId:"installation",id:"installation",title:"Installation",description:"Prerequisites",source:"@site/docs/installation.md",sourceDirName:".",slug:"/installation",permalink:"/installation",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/installation.md",tags:[],version:"current",frontMatter:{title:"Installation",sidebar_label:"Installation"},sidebar:"docs",previous:{title:"Core Concepts",permalink:"/core-concepts"},next:{title:"Design choices",permalink:"/design-choices"}},s={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installation",id:"installation",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"prerequisites"},"Prerequisites"),(0,o.kt)("p",null,"Even though you can use Boxed without TypeScript and still leverage some benefits, we recommend to use it to get all of the benefits Boxed can provide."),(0,o.kt)("h2",{id:"installation"},"Installation"),(0,o.kt)("p",null,"In your console"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-console"},"$ yarn add @swan-io/boxed\n")),(0,o.kt)("p",null,"or"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-console"},"$ npm install @swan-io/boxed\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3d955d88.74c1e55f.js b/assets/js/3d955d88.74c1e55f.js new file mode 100644 index 00000000..a3146975 --- /dev/null +++ b/assets/js/3d955d88.74c1e55f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[245],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var c=r.createContext({}),i=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=i(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=i(n),m=l,d=p["".concat(c,".").concat(m)]||p[m]||f[m]||o;return n?r.createElement(d,a(a({ref:t},u),{},{components:n})):r.createElement(d,a({ref:t},u))}));function d(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:l,a[1]=s;for(var i=2;i{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>f,frontMatter:()=>o,metadata:()=>s,toc:()=>i});var r=n(7462),l=(n(7294),n(3905));const o={title:"Cancellable Request",sidebar_label:"Cancellable Request"},a=void 0,s={unversionedId:"cancellable-request",id:"cancellable-request",title:"Cancellable Request",description:"When using the naive fetch, cancelling a request can be inelegant:",source:"@site/docs/cancellable-request.md",sourceDirName:".",slug:"/cancellable-request",permalink:"/cancellable-request",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/cancellable-request.md",tags:[],version:"current",frontMatter:{title:"Cancellable Request",sidebar_label:"Cancellable Request"},sidebar:"docs",previous:{title:"Nested optional values",permalink:"/nested-optional-values"},next:{title:"Retry",permalink:"/retry"}},c={},i=[],u={toc:i},p="wrapper";function f(e){let{components:t,...n}=e;return(0,l.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"When using the naive ",(0,l.kt)("inlineCode",{parentName:"p"},"fetch"),", cancelling a request can be inelegant:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},'import { useEffect } from "react";\nimport { Result } from "@swan-io/boxed";\n\nconst callMyApi = (url, { signal }) => {\n return fetch(url, { signal })\n .then((res) => res.json())\n .then((json) => Result.Ok(res))\n .catch((error) => Result.Error(error));\n};\n\n// ...\nuseEffect(() => {\n // Implementation details leak to your components\n const controller = new AbortController();\n callMyApi("/users", { signal: controller.signal })\n .then((res) => res.json())\n .then((json) => setState(Result.Ok(json)))\n .catch((error) => setState(Result.Error(error)));\n return () => controller.abort();\n}, []);\n')),(0,l.kt)("p",null,"Using ",(0,l.kt)("inlineCode",{parentName:"p"},"Future")," can make this easier:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},'import { useEffect } from "react";\nimport { Future, Result } from "@swan-io/boxed";\n\nconst callMyApi = (url: string) =>\n Future.make((resolve) => {\n const controller = new AbortController();\n\n fetch(url, { signal: controller.signal })\n .then((res) => res.json())\n .then((json) => resolve(Result.Ok(json)))\n .catch((error) => resolve(Result.Error(error)));\n\n // Here, the implementation detail is managed in place\n return () => controller.abort();\n });\n\n// And the noise dissapears from your components!\nuseEffect(() => {\n const request = callMyApi("/api").tap(setState);\n return () => request.cancel();\n}, []);\n')))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3d955d88.e0c1f8b6.js b/assets/js/3d955d88.e0c1f8b6.js deleted file mode 100644 index 8e34c828..00000000 --- a/assets/js/3d955d88.e0c1f8b6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[245],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),i=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=i(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,l=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=i(n),m=o,d=p["".concat(c,".").concat(m)]||p[m]||f[m]||l;return n?r.createElement(d,a(a({ref:t},u),{},{components:n})):r.createElement(d,a({ref:t},u))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var l=n.length,a=new Array(l);a[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:o,a[1]=s;for(var i=2;i{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>f,frontMatter:()=>l,metadata:()=>s,toc:()=>i});var r=n(7462),o=(n(7294),n(3905));const l={title:"Cancellable Request",sidebar_label:"Cancellable Request"},a=void 0,s={unversionedId:"cancellable-request",id:"cancellable-request",title:"Cancellable Request",description:"When using the naive fetch, cancelling a request can be inelegant:",source:"@site/docs/cancellable-request.md",sourceDirName:".",slug:"/cancellable-request",permalink:"/boxed/cancellable-request",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/cancellable-request.md",tags:[],version:"current",frontMatter:{title:"Cancellable Request",sidebar_label:"Cancellable Request"},sidebar:"docs",previous:{title:"Nested optional values",permalink:"/boxed/nested-optional-values"},next:{title:"Retry",permalink:"/boxed/retry"}},c={},i=[],u={toc:i},p="wrapper";function f(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"When using the naive ",(0,o.kt)("inlineCode",{parentName:"p"},"fetch"),", cancelling a request can be inelegant:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'import { useEffect } from "react";\nimport { Result } from "@swan-io/boxed";\n\nconst callMyApi = (url, { signal }) => {\n return fetch(url, { signal })\n .then((res) => res.json())\n .then((json) => Result.Ok(res))\n .catch((error) => Result.Error(error));\n};\n\n// ...\nuseEffect(() => {\n // Implementation details leak to your components\n const controller = new AbortController();\n callMyApi("/users", { signal: controller.signal })\n .then((res) => res.json())\n .then((json) => setState(Result.Ok(json)))\n .catch((error) => setState(Result.Error(error)));\n return () => controller.abort();\n}, []);\n')),(0,o.kt)("p",null,"Using ",(0,o.kt)("inlineCode",{parentName:"p"},"Future")," can make this easier:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'import { useEffect } from "react";\nimport { Future, Result } from "@swan-io/boxed";\n\nconst callMyApi = (url: string) =>\n Future.make((resolve) => {\n const controller = new AbortController();\n\n fetch(url, { signal: controller.signal })\n .then((res) => res.json())\n .then((json) => resolve(Result.Ok(json)))\n .catch((error) => resolve(Result.Error(error)));\n\n // Here, the implementation detail is managed in place\n return () => controller.abort();\n });\n\n// And the noise dissapears from your components!\nuseEffect(() => {\n const request = callMyApi("/api").tap(setState);\n return () => request.cancel();\n}, []);\n')))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/414a3798.3626043e.js b/assets/js/414a3798.2948022d.js similarity index 53% rename from assets/js/414a3798.3626043e.js rename to assets/js/414a3798.2948022d.js index 6cc6c546..295ebfbe 100644 --- a/assets/js/414a3798.3626043e.js +++ b/assets/js/414a3798.2948022d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[960],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=l(r),m=a,f=p["".concat(c,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(f,s(s({ref:t},u),{},{components:r})):n.createElement(f,s({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var n=r(7462),a=(r(7294),r(3905));const o={title:"React Request",sidebar_label:"React Request"},s=void 0,i={unversionedId:"react-request",id:"react-request",title:"React Request",description:"The AsyncData type removes the need for manual request modeling.",source:"@site/docs/react-request.md",sourceDirName:".",slug:"/react-request",permalink:"/boxed/react-request",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/react-request.md",tags:[],version:"current",frontMatter:{title:"React Request",sidebar_label:"React Request"},sidebar:"docs",previous:{title:"Serializer",permalink:"/boxed/serializer"},next:{title:"Form Validation",permalink:"/boxed/form-validation"}},c={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The ",(0,a.kt)("strong",{parentName:"p"},"AsyncData")," type removes the need for manual request modeling."),(0,a.kt)("p",null,"Instead of having to maintain a state like the following, you can store the ",(0,a.kt)("inlineCode",{parentName:"p"},"AsyncData")," value directly."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"type UserQuery = {\n isLoading: boolean;\n error: Error;\n data: User;\n};\n")),(0,a.kt)("p",null,"The problem with this representation is that it can represent impossible states, and require additional work to make it safe. It will also encourage nested conditions, which decreases code readability."),(0,a.kt)("p",null,"Here's how we can represent this using the ",(0,a.kt)("inlineCode",{parentName:"p"},"AsyncData")," type."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'import { useState, useEffect } from "react";\nimport { AsyncData } from "@swan-io/boxed";\nimport { queryUser, User } from "./api";\n\ntype Props = {\n userId: string;\n};\n\nconst UserPage = ({ userId }: Props) => {\n // Initially, the request hasn\'t performed\n const [user, setUser] = useState(() => AsyncData.NotAsked());\n\n useEffect(() => {\n // Indicate that we started loading\n setUser(AsyncData.Loading());\n const cancel = queryUser({ userId }, (user) => {\n // Then, set the received value\n setUser(AsyncData.Done(user));\n });\n return cancel;\n }, [userId]);\n\n // We can then match on the value, in a flat way\n return user.match({\n NotAsked: () => null,\n Loading: () => `Loading`,\n Done: (user) => `Hello ${user.name}!`,\n });\n};\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[960],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=l(r),m=a,f=p["".concat(c,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(f,s(s({ref:t},u),{},{components:r})):n.createElement(f,s({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,s=new Array(o);s[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var n=r(7462),a=(r(7294),r(3905));const o={title:"React Request",sidebar_label:"React Request"},s=void 0,i={unversionedId:"react-request",id:"react-request",title:"React Request",description:"The AsyncData type removes the need for manual request modeling.",source:"@site/docs/react-request.md",sourceDirName:".",slug:"/react-request",permalink:"/react-request",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/react-request.md",tags:[],version:"current",frontMatter:{title:"React Request",sidebar_label:"React Request"},sidebar:"docs",previous:{title:"Serializer",permalink:"/serializer"},next:{title:"Form Validation",permalink:"/form-validation"}},c={},l=[],u={toc:l},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The ",(0,a.kt)("strong",{parentName:"p"},"AsyncData")," type removes the need for manual request modeling."),(0,a.kt)("p",null,"Instead of having to maintain a state like the following, you can store the ",(0,a.kt)("inlineCode",{parentName:"p"},"AsyncData")," value directly."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"type UserQuery = {\n isLoading: boolean;\n error: Error;\n data: User;\n};\n")),(0,a.kt)("p",null,"The problem with this representation is that it can represent impossible states, and require additional work to make it safe. It will also encourage nested conditions, which decreases code readability."),(0,a.kt)("p",null,"Here's how we can represent this using the ",(0,a.kt)("inlineCode",{parentName:"p"},"AsyncData")," type."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'import { useState, useEffect } from "react";\nimport { AsyncData } from "@swan-io/boxed";\nimport { queryUser, User } from "./api";\n\ntype Props = {\n userId: string;\n};\n\nconst UserPage = ({ userId }: Props) => {\n // Initially, the request hasn\'t performed\n const [user, setUser] = useState(() => AsyncData.NotAsked());\n\n useEffect(() => {\n // Indicate that we started loading\n setUser(AsyncData.Loading());\n const cancel = queryUser({ userId }, (user) => {\n // Then, set the received value\n setUser(AsyncData.Done(user));\n });\n return cancel;\n }, [userId]);\n\n // We can then match on the value, in a flat way\n return user.match({\n NotAsked: () => null,\n Loading: () => `Loading`,\n Done: (user) => `Hello ${user.name}!`,\n });\n};\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/43cd4838.10b358ab.js b/assets/js/43cd4838.10b358ab.js deleted file mode 100644 index 2d720067..00000000 --- a/assets/js/43cd4838.10b358ab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[658],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=o,h=u["".concat(s,".").concat(m)]||u[m]||d[m]||r;return n?a.createElement(h,i(i({ref:t},c),{},{components:n})):a.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>p});var a=n(7462),o=(n(7294),n(3905));const r={title:"Core Concepts",sidebar_label:"Core Concepts"},i=void 0,l={unversionedId:"core-concepts",id:"core-concepts",title:"Core Concepts",description:"The Boxed approach takes root in typed functional paradigms. We know that these concepts can be overwhelming, especially with their jargon and mathematical concepts, and therefore want to make them more accessible.",source:"@site/docs/core-concepts.md",sourceDirName:".",slug:"/core-concepts",permalink:"/boxed/core-concepts",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/core-concepts.md",tags:[],version:"current",frontMatter:{title:"Core Concepts",sidebar_label:"Core Concepts"},sidebar:"docs",previous:{title:"Getting started",permalink:"/boxed/getting-started"},next:{title:"Installation",permalink:"/boxed/installation"}},s={},p=[{value:"Schr\xf6dinger's cat",id:"schr\xf6dingers-cat",level:2},{value:"Boxes",id:"boxes",level:2},{value:"Data-manipulation basics",id:"data-manipulation-basics",level:2},{value:"The main kind of boxes",id:"the-main-kind-of-boxes",level:2},{value:"Option<Value>",id:"optionvalue",level:3},{value:"Result<Ok, Error>",id:"resultok-error",level:3},{value:"AsyncData<Value>",id:"asyncdatavalue",level:3},{value:"Future<Value>",id:"futurevalue",level:3}],c={toc:p},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"The Boxed approach takes root in ",(0,o.kt)("strong",{parentName:"p"},"typed functional paradigms"),". We know that these concepts can be overwhelming, especially with their jargon and mathematical concepts, and therefore want to make them more ",(0,o.kt)("strong",{parentName:"p"},"accessible"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{src:n(2522).Z,width:"600",height:"600"})),(0,o.kt)("p",null,"As beautiful and powerful these concepts are, they come with a huge learning curve that we want to avoid. We also want your code to be ",(0,o.kt)("strong",{parentName:"p"},"simple to read, write and reason about")," without having to know the full theory behind."),(0,o.kt)("admonition",{type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"If you have a strong opinion on what metaphor to use to describe monads, please stop reading this page immediately and visit the ",(0,o.kt)("a",{parentName:"p",href:"./option"},"API reference"),".")),(0,o.kt)("h2",{id:"schr\xf6dingers-cat"},"Schr\xf6dinger's cat"),(0,o.kt)("p",null,"When physicists discovered that particules do weird stuff, they decided that while we don't look at them, they're in a ",(0,o.kt)("strong",{parentName:"p"},"superposition of states"),"."),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Erwin_Schr%C3%B6dinger"},"Erwin Schr\xf6dinger")," didn't like that one bit and decided to show them how utterly stupid it was. For that, he created a thought experiment now called the ",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Schr%C3%B6dinger%27s_cat"},"Schr\xf6dinger's cat")," experiment, in which a cat is put into a ",(0,o.kt)("strong",{parentName:"p"},"box")," (",(0,o.kt)("em",{parentName:"p"},"roll credits"),") with a cat-killing device reacting to some quantum stuff. While we don't open the box, the cat is both alive and dead as the same time, when we open the box, we fix an outcome."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Schr\xf6dinger's cat experiment",src:n(986).Z,width:"1074",height:"954"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"We ",(0,o.kt)("strong",{parentName:"p"},"love")," cats and the boxes used in the following explanations will only contain JavaScript values.")),(0,o.kt)("h2",{id:"boxes"},"Boxes"),(0,o.kt)("p",null,"The way we like to think of the data-structures we expose are that they're ",(0,o.kt)("strong",{parentName:"p"},"boxes")," (think of it as containers) that ",(0,o.kt)("strong",{parentName:"p"},"may or may not contain a value"),"."),(0,o.kt)("p",null,"Here's a visual example using the ",(0,o.kt)("strong",{parentName:"p"},"Option type"),". The Option represents an optional value, ",(0,o.kt)("strong",{parentName:"p"},"it can have two possible states"),": either ",(0,o.kt)("inlineCode",{parentName:"p"},"Some(value)")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"None()"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Option of blue circle, it can be either a box containing a blue circle, which we call Some blue circle, or an empty box, which we call None",src:n(5202).Z,width:"1385",height:"767"})),(0,o.kt)("p",null,"Option is a generic type, meaning you can define what type of value it holds: ",(0,o.kt)("inlineCode",{parentName:"p"},"Option"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Option")," (just like an array: ",(0,o.kt)("inlineCode",{parentName:"p"},"Array"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Array"),")."),(0,o.kt)("p",null,"In your program flow, you don't know what's inside, ",(0,o.kt)("strong",{parentName:"p"},"as if the box was closed"),"."),(0,o.kt)("p",null,"When you extract the value from the box, you have a few options:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"// Let's assument we have `option` be of type `Option`\n\n// Returns the value if present or the fallback otherwise\nconst a = option.getOr(0);\n\n// Explode the box\nconst b = option.match({\n Some: (value) => value,\n None: () => 0,\n});\n")),(0,o.kt)("h2",{id:"data-manipulation-basics"},"Data-manipulation basics"),(0,o.kt)("p",null,"Most of the data-manipulation you'll do comes down to two function: ",(0,o.kt)("inlineCode",{parentName:"p"},"map")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"flatMap"),"."),(0,o.kt)("p",null,"Here's a visual explanation:"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"The map function transforms the value with a callback, the flatMap function returns an box itself",src:n(6320).Z,width:"3110",height:"4326"})),(0,o.kt)("p",null,"The ",(0,o.kt)("inlineCode",{parentName:"p"},"map")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"flatMap")," functions allow you to transform data in a typesafe way:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const some = Option.Some(1);\n// Option.Some<1>\n\nconst none = Option.None();\n// Option.None\n\nconst doubledSome = some.map((x) => x * 2);\n// Option.Some<2>\n\nconst doubledNone = none.map((x) => x * 2);\n// Option.None -> Nothing to transform!\n")),(0,o.kt)("p",null,"The ",(0,o.kt)("inlineCode",{parentName:"p"},"flatMap")," lets you return another option, which can be useful for nested optional values:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'type UserInfo = {\n name: Option;\n};\n\ntype User = {\n id: string;\n info: Option;\n};\n\nconst name = user\n .flatMap((user) => user.info) // Returns the Option\n .flatMap((info) => info.name) // Returns the Option\n .getOr("Anonymous user");\n')),(0,o.kt)("h2",{id:"the-main-kind-of-boxes"},"The main kind of boxes"),(0,o.kt)("h3",{id:"optionvalue"},(0,o.kt)("a",{parentName:"h3",href:"/option"},(0,o.kt)("strong",{parentName:"a"},"Option"))),(0,o.kt)("p",null,"Represents optional values:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Replaces ",(0,o.kt)("inlineCode",{parentName:"li"},"undefined")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"null")),(0,o.kt)("li",{parentName:"ul"},"Makes it possible to differentiate nested optionality (",(0,o.kt)("inlineCode",{parentName:"li"},"Some(None())")," vs ",(0,o.kt)("inlineCode",{parentName:"li"},"None()"),")"),(0,o.kt)("li",{parentName:"ul"},"Reduces the number of codepaths needed to read and transform such values")),(0,o.kt)("h3",{id:"resultok-error"},(0,o.kt)("a",{parentName:"h3",href:"/result"},(0,o.kt)("strong",{parentName:"a"},"Result"))),(0,o.kt)("p",null,"Represents a computation that can either succeed or fail:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Replaces exceptions"),(0,o.kt)("li",{parentName:"ul"},'Allows you to have a single codepath instead or "return or throw".'),(0,o.kt)("li",{parentName:"ul"},"Makes it easy to aggregate all possible errors a stack can generate")),(0,o.kt)("h3",{id:"asyncdatavalue"},(0,o.kt)("a",{parentName:"h3",href:"/async-data"},(0,o.kt)("strong",{parentName:"a"},"AsyncData"))),(0,o.kt)("p",null,"Represents a value with an asynchronous lifecycle:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Eliminates impossibles cases in your state"),(0,o.kt)("li",{parentName:"ul"},"Avoids inconsistent states induced by traditional modeling"),(0,o.kt)("li",{parentName:"ul"},"Allows you to tie the lifecycle information with the value itself")),(0,o.kt)("h3",{id:"futurevalue"},(0,o.kt)("a",{parentName:"h3",href:"/future"},(0,o.kt)("strong",{parentName:"a"},"Future"))),(0,o.kt)("p",null,"Represents an asynchronous value:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Replaces promises"),(0,o.kt)("li",{parentName:"ul"},"Supports cancellation"),(0,o.kt)("li",{parentName:"ul"},"Delegates success/failure to the Result type"),(0,o.kt)("li",{parentName:"ul"},"Exposes a ",(0,o.kt)("inlineCode",{parentName:"li"},"map")," & ",(0,o.kt)("inlineCode",{parentName:"li"},"flatMap")," API")))}d.isMDXComponent=!0},986:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/experiment-565324f87cbe4e36c830c1c333093fc4.png"},6320:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/map-flatmap-f95738f76dbe79a5b58ffa3a5184645d.webp"},5202:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/option-3a6b71386fd878a3acb86dbe414fec5f.png"},2522:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/profunctor-optics-5da0c027fb8f430abacd7390d1fa6393.jpg"}}]); \ No newline at end of file diff --git a/assets/js/43cd4838.6db9482e.js b/assets/js/43cd4838.6db9482e.js new file mode 100644 index 00000000..a773edb3 --- /dev/null +++ b/assets/js/43cd4838.6db9482e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[658],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=o,h=u["".concat(s,".").concat(m)]||u[m]||d[m]||r;return n?a.createElement(h,i(i({ref:t},c),{},{components:n})):a.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>p});var a=n(7462),o=(n(7294),n(3905));const r={title:"Core Concepts",sidebar_label:"Core Concepts"},i=void 0,l={unversionedId:"core-concepts",id:"core-concepts",title:"Core Concepts",description:"The Boxed approach takes root in typed functional paradigms. We know that these concepts can be overwhelming, especially with their jargon and mathematical concepts, and therefore want to make them more accessible.",source:"@site/docs/core-concepts.md",sourceDirName:".",slug:"/core-concepts",permalink:"/core-concepts",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/core-concepts.md",tags:[],version:"current",frontMatter:{title:"Core Concepts",sidebar_label:"Core Concepts"},sidebar:"docs",previous:{title:"Getting started",permalink:"/getting-started"},next:{title:"Installation",permalink:"/installation"}},s={},p=[{value:"Schr\xf6dinger's cat",id:"schr\xf6dingers-cat",level:2},{value:"Boxes",id:"boxes",level:2},{value:"Data-manipulation basics",id:"data-manipulation-basics",level:2},{value:"The main kind of boxes",id:"the-main-kind-of-boxes",level:2},{value:"Option<Value>",id:"optionvalue",level:3},{value:"Result<Ok, Error>",id:"resultok-error",level:3},{value:"AsyncData<Value>",id:"asyncdatavalue",level:3},{value:"Future<Value>",id:"futurevalue",level:3}],c={toc:p},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"The Boxed approach takes root in ",(0,o.kt)("strong",{parentName:"p"},"typed functional paradigms"),". We know that these concepts can be overwhelming, especially with their jargon and mathematical concepts, and therefore want to make them more ",(0,o.kt)("strong",{parentName:"p"},"accessible"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{src:n(2522).Z,width:"600",height:"600"})),(0,o.kt)("p",null,"As beautiful and powerful these concepts are, they come with a huge learning curve that we want to avoid. We also want your code to be ",(0,o.kt)("strong",{parentName:"p"},"simple to read, write and reason about")," without having to know the full theory behind."),(0,o.kt)("admonition",{type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"If you have a strong opinion on what metaphor to use to describe monads, please stop reading this page immediately and visit the ",(0,o.kt)("a",{parentName:"p",href:"./option"},"API reference"),".")),(0,o.kt)("h2",{id:"schr\xf6dingers-cat"},"Schr\xf6dinger's cat"),(0,o.kt)("p",null,"When physicists discovered that particules do weird stuff, they decided that while we don't look at them, they're in a ",(0,o.kt)("strong",{parentName:"p"},"superposition of states"),"."),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Erwin_Schr%C3%B6dinger"},"Erwin Schr\xf6dinger")," didn't like that one bit and decided to show them how utterly stupid it was. For that, he created a thought experiment now called the ",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Schr%C3%B6dinger%27s_cat"},"Schr\xf6dinger's cat")," experiment, in which a cat is put into a ",(0,o.kt)("strong",{parentName:"p"},"box")," (",(0,o.kt)("em",{parentName:"p"},"roll credits"),") with a cat-killing device reacting to some quantum stuff. While we don't open the box, the cat is both alive and dead as the same time, when we open the box, we fix an outcome."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Schr\xf6dinger's cat experiment",src:n(986).Z,width:"1074",height:"954"})),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"We ",(0,o.kt)("strong",{parentName:"p"},"love")," cats and the boxes used in the following explanations will only contain JavaScript values.")),(0,o.kt)("h2",{id:"boxes"},"Boxes"),(0,o.kt)("p",null,"The way we like to think of the data-structures we expose are that they're ",(0,o.kt)("strong",{parentName:"p"},"boxes")," (think of it as containers) that ",(0,o.kt)("strong",{parentName:"p"},"may or may not contain a value"),"."),(0,o.kt)("p",null,"Here's a visual example using the ",(0,o.kt)("strong",{parentName:"p"},"Option type"),". The Option represents an optional value, ",(0,o.kt)("strong",{parentName:"p"},"it can have two possible states"),": either ",(0,o.kt)("inlineCode",{parentName:"p"},"Some(value)")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"None()"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Option of blue circle, it can be either a box containing a blue circle, which we call Some blue circle, or an empty box, which we call None",src:n(5202).Z,width:"1385",height:"767"})),(0,o.kt)("p",null,"Option is a generic type, meaning you can define what type of value it holds: ",(0,o.kt)("inlineCode",{parentName:"p"},"Option"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Option")," (just like an array: ",(0,o.kt)("inlineCode",{parentName:"p"},"Array"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"Array"),")."),(0,o.kt)("p",null,"In your program flow, you don't know what's inside, ",(0,o.kt)("strong",{parentName:"p"},"as if the box was closed"),"."),(0,o.kt)("p",null,"When you extract the value from the box, you have a few options:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"// Let's assument we have `option` be of type `Option`\n\n// Returns the value if present or the fallback otherwise\nconst a = option.getOr(0);\n\n// Explode the box\nconst b = option.match({\n Some: (value) => value,\n None: () => 0,\n});\n")),(0,o.kt)("h2",{id:"data-manipulation-basics"},"Data-manipulation basics"),(0,o.kt)("p",null,"Most of the data-manipulation you'll do comes down to two function: ",(0,o.kt)("inlineCode",{parentName:"p"},"map")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"flatMap"),"."),(0,o.kt)("p",null,"Here's a visual explanation:"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"The map function transforms the value with a callback, the flatMap function returns an box itself",src:n(6320).Z,width:"3110",height:"4326"})),(0,o.kt)("p",null,"The ",(0,o.kt)("inlineCode",{parentName:"p"},"map")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"flatMap")," functions allow you to transform data in a typesafe way:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const some = Option.Some(1);\n// Option.Some<1>\n\nconst none = Option.None();\n// Option.None\n\nconst doubledSome = some.map((x) => x * 2);\n// Option.Some<2>\n\nconst doubledNone = none.map((x) => x * 2);\n// Option.None -> Nothing to transform!\n")),(0,o.kt)("p",null,"The ",(0,o.kt)("inlineCode",{parentName:"p"},"flatMap")," lets you return another option, which can be useful for nested optional values:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'type UserInfo = {\n name: Option;\n};\n\ntype User = {\n id: string;\n info: Option;\n};\n\nconst name = user\n .flatMap((user) => user.info) // Returns the Option\n .flatMap((info) => info.name) // Returns the Option\n .getOr("Anonymous user");\n')),(0,o.kt)("h2",{id:"the-main-kind-of-boxes"},"The main kind of boxes"),(0,o.kt)("h3",{id:"optionvalue"},(0,o.kt)("a",{parentName:"h3",href:"/option"},(0,o.kt)("strong",{parentName:"a"},"Option"))),(0,o.kt)("p",null,"Represents optional values:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Replaces ",(0,o.kt)("inlineCode",{parentName:"li"},"undefined")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"null")),(0,o.kt)("li",{parentName:"ul"},"Makes it possible to differentiate nested optionality (",(0,o.kt)("inlineCode",{parentName:"li"},"Some(None())")," vs ",(0,o.kt)("inlineCode",{parentName:"li"},"None()"),")"),(0,o.kt)("li",{parentName:"ul"},"Reduces the number of codepaths needed to read and transform such values")),(0,o.kt)("h3",{id:"resultok-error"},(0,o.kt)("a",{parentName:"h3",href:"/result"},(0,o.kt)("strong",{parentName:"a"},"Result"))),(0,o.kt)("p",null,"Represents a computation that can either succeed or fail:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Replaces exceptions"),(0,o.kt)("li",{parentName:"ul"},'Allows you to have a single codepath instead or "return or throw".'),(0,o.kt)("li",{parentName:"ul"},"Makes it easy to aggregate all possible errors a stack can generate")),(0,o.kt)("h3",{id:"asyncdatavalue"},(0,o.kt)("a",{parentName:"h3",href:"/async-data"},(0,o.kt)("strong",{parentName:"a"},"AsyncData"))),(0,o.kt)("p",null,"Represents a value with an asynchronous lifecycle:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Eliminates impossibles cases in your state"),(0,o.kt)("li",{parentName:"ul"},"Avoids inconsistent states induced by traditional modeling"),(0,o.kt)("li",{parentName:"ul"},"Allows you to tie the lifecycle information with the value itself")),(0,o.kt)("h3",{id:"futurevalue"},(0,o.kt)("a",{parentName:"h3",href:"/future"},(0,o.kt)("strong",{parentName:"a"},"Future"))),(0,o.kt)("p",null,"Represents an asynchronous value:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Replaces promises"),(0,o.kt)("li",{parentName:"ul"},"Supports cancellation"),(0,o.kt)("li",{parentName:"ul"},"Delegates success/failure to the Result type"),(0,o.kt)("li",{parentName:"ul"},"Exposes a ",(0,o.kt)("inlineCode",{parentName:"li"},"map")," & ",(0,o.kt)("inlineCode",{parentName:"li"},"flatMap")," API")))}d.isMDXComponent=!0},986:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/experiment-565324f87cbe4e36c830c1c333093fc4.png"},6320:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/map-flatmap-f95738f76dbe79a5b58ffa3a5184645d.webp"},5202:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/option-3a6b71386fd878a3acb86dbe414fec5f.png"},2522:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/profunctor-optics-5da0c027fb8f430abacd7390d1fa6393.jpg"}}]); \ No newline at end of file diff --git a/assets/js/44ef08bc.670e1402.js b/assets/js/44ef08bc.670e1402.js new file mode 100644 index 00000000..8bb8667a --- /dev/null +++ b/assets/js/44ef08bc.670e1402.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[61],{3905:(e,n,t)=>{t.d(n,{Zo:()=>u,kt:()=>f});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),p=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},u=function(e){var n=p(e.components);return r.createElement(s.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=p(t),m=a,f=d["".concat(s,".").concat(m)]||d[m]||c[m]||i;return t?r.createElement(f,o(o({ref:n},u),{},{components:t})):r.createElement(f,o({ref:n},u))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=m;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[d]="string"==typeof e?e:a,o[1]=l;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=t(7462),a=(t(7294),t(3905));const i={title:"Form Validation",sidebar_label:"Form Validation"},o=void 0,l={unversionedId:"form-validation",id:"form-validation",title:"Form Validation",description:"A common need in applications is to validate user-input before sending it to the server.",source:"@site/docs/form-validation.md",sourceDirName:".",slug:"/form-validation",permalink:"/form-validation",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/form-validation.md",tags:[],version:"current",frontMatter:{title:"Form Validation",sidebar_label:"Form Validation"},sidebar:"docs",previous:{title:"React Request",permalink:"/react-request"},next:{title:"Nested optional values",permalink:"/nested-optional-values"}},s={},p=[],u={toc:p},d="wrapper";function c(e){let{components:n,...t}=e;return(0,a.kt)(d,(0,r.Z)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"A common need in applications is to validate user-input before sending it to the server."),(0,a.kt)("p",null,"Let's assume we have a form with the following fields:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"type FormInput = {\n id: string;\n amount: number;\n};\n")),(0,a.kt)("p",null,"One can use exceptions:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'const validate = (input: FormInput) => {\n if (input.id.trim().length !== 24) {\n throw new Error("Input ID is invalid");\n }\n if (input.amount <= 0) {\n throw new Error("Invalid amount");\n }\n};\n')),(0,a.kt)("p",null,"In that case, we'd use a ",(0,a.kt)("inlineCode",{parentName:"p"},"try")," statement:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"try {\n const sanitized = sanitize(input);\n validate(sanitized);\n setValidation(null);\n\n // send to the server\n} catch (err) {\n setValidation(err);\n}\n")),(0,a.kt)("p",null,"Or one can return errors from the ",(0,a.kt)("inlineCode",{parentName:"p"},"validate")," function:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'const validate = (input: FormInput) => {\n const errors = [];\n if (input.id.trim().length !== 24) {\n errors.push("Input ID is invalid");\n }\n if (input.amount <= 0) {\n errors.push("Invalid amount");\n }\n return errors;\n};\n')),(0,a.kt)("p",null,"Which would be consumed like the following:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"const sanitized = sanitize(input);\nconst errors = validate(sanitized);\nif (errors.length) {\n setValidation(errors);\n // show the errors\n} else {\n setValidation(null);\n // send to the server\n}\n")),(0,a.kt)("p",null,"In both cases, we are required to have handle the ",(0,a.kt)("inlineCode",{parentName:"p"},"validation")," state manually, which increases complexity and can lead to UI inconsistencies. Let's see how we can leverage the ",(0,a.kt)("inlineCode",{parentName:"p"},"Result")," type for such patterns:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'import { Result } from "@swan-io/boxed";\n\nconst validate = (input: FormInput): Result> => {\n const errors = [];\n const id = input.id.trim();\n if (id.length !== 24) {\n errors.push("Input ID is invalid");\n }\n if (input.amount <= 0) {\n errors.push("Invalid amount");\n }\n\n // We can directly return a sanitized version if the validation passed\n return errors.length === 0\n ? Result.Ok({ ...input, id })\n : Result.Error(errors);\n};\n')),(0,a.kt)("p",null,"Here, the ",(0,a.kt)("inlineCode",{parentName:"p"},"validate")," return value can directly give you ",(0,a.kt)("strong",{parentName:"p"},"the sanitized input")," or ",(0,a.kt)("strong",{parentName:"p"},"the validation errors"),", depending on which case you're in."),(0,a.kt)("p",null,"We can then store the ",(0,a.kt)("inlineCode",{parentName:"p"},"Result")," directly:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'// A single codepath for handling the validation\nconst validation = validate(input);\n\nsetValidation(validation);\n\nvalidation.match({\n Error: () => {} // do nothing\n Ok: (sanitizedInput) => {\n sendToServer(sanitizedInput)\n }\n})\n\n// and pattern match in the UI code\n setInput({...input, id}))}\n hasError={validation.match({\n Ok: () => false,\n Error: (errors) => errors.includes("Input ID is invalid"),\n })}\n/>;\n')))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/44ef08bc.9f344e37.js b/assets/js/44ef08bc.9f344e37.js deleted file mode 100644 index a7634aea..00000000 --- a/assets/js/44ef08bc.9f344e37.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[61],{3905:(e,n,t)=>{t.d(n,{Zo:()=>u,kt:()=>f});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),p=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},u=function(e){var n=p(e.components);return r.createElement(s.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=p(t),m=a,f=d["".concat(s,".").concat(m)]||d[m]||c[m]||i;return t?r.createElement(f,o(o({ref:n},u),{},{components:t})):r.createElement(f,o({ref:n},u))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=m;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[d]="string"==typeof e?e:a,o[1]=l;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=t(7462),a=(t(7294),t(3905));const i={title:"Form Validation",sidebar_label:"Form Validation"},o=void 0,l={unversionedId:"form-validation",id:"form-validation",title:"Form Validation",description:"A common need in applications is to validate user-input before sending it to the server.",source:"@site/docs/form-validation.md",sourceDirName:".",slug:"/form-validation",permalink:"/boxed/form-validation",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/form-validation.md",tags:[],version:"current",frontMatter:{title:"Form Validation",sidebar_label:"Form Validation"},sidebar:"docs",previous:{title:"React Request",permalink:"/boxed/react-request"},next:{title:"Nested optional values",permalink:"/boxed/nested-optional-values"}},s={},p=[],u={toc:p},d="wrapper";function c(e){let{components:n,...t}=e;return(0,a.kt)(d,(0,r.Z)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"A common need in applications is to validate user-input before sending it to the server."),(0,a.kt)("p",null,"Let's assume we have a form with the following fields:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"type FormInput = {\n id: string;\n amount: number;\n};\n")),(0,a.kt)("p",null,"One can use exceptions:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'const validate = (input: FormInput) => {\n if (input.id.trim().length !== 24) {\n throw new Error("Input ID is invalid");\n }\n if (input.amount <= 0) {\n throw new Error("Invalid amount");\n }\n};\n')),(0,a.kt)("p",null,"In that case, we'd use a ",(0,a.kt)("inlineCode",{parentName:"p"},"try")," statement:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"try {\n const sanitized = sanitize(input);\n validate(sanitized);\n setValidation(null);\n\n // send to the server\n} catch (err) {\n setValidation(err);\n}\n")),(0,a.kt)("p",null,"Or one can return errors from the ",(0,a.kt)("inlineCode",{parentName:"p"},"validate")," function:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'const validate = (input: FormInput) => {\n const errors = [];\n if (input.id.trim().length !== 24) {\n errors.push("Input ID is invalid");\n }\n if (input.amount <= 0) {\n errors.push("Invalid amount");\n }\n return errors;\n};\n')),(0,a.kt)("p",null,"Which would be consumed like the following:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"const sanitized = sanitize(input);\nconst errors = validate(sanitized);\nif (errors.length) {\n setValidation(errors);\n // show the errors\n} else {\n setValidation(null);\n // send to the server\n}\n")),(0,a.kt)("p",null,"In both cases, we are required to have handle the ",(0,a.kt)("inlineCode",{parentName:"p"},"validation")," state manually, which increases complexity and can lead to UI inconsistencies. Let's see how we can leverage the ",(0,a.kt)("inlineCode",{parentName:"p"},"Result")," type for such patterns:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'import { Result } from "@swan-io/boxed";\n\nconst validate = (input: FormInput): Result> => {\n const errors = [];\n const id = input.id.trim();\n if (id.length !== 24) {\n errors.push("Input ID is invalid");\n }\n if (input.amount <= 0) {\n errors.push("Invalid amount");\n }\n\n // We can directly return a sanitized version if the validation passed\n return errors.length === 0\n ? Result.Ok({ ...input, id })\n : Result.Error(errors);\n};\n')),(0,a.kt)("p",null,"Here, the ",(0,a.kt)("inlineCode",{parentName:"p"},"validate")," return value can directly give you ",(0,a.kt)("strong",{parentName:"p"},"the sanitized input")," or ",(0,a.kt)("strong",{parentName:"p"},"the validation errors"),", depending on which case you're in."),(0,a.kt)("p",null,"We can then store the ",(0,a.kt)("inlineCode",{parentName:"p"},"Result")," directly:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'// A single codepath for handling the validation\nconst validation = validate(input);\n\nsetValidation(validation);\n\nvalidation.match({\n Error: () => {} // do nothing\n Ok: (sanitizedInput) => {\n sendToServer(sanitizedInput)\n }\n})\n\n// and pattern match in the UI code\n setInput({...input, id}))}\n hasError={validation.match({\n Ok: () => false,\n Error: (errors) => errors.includes("Input ID is invalid"),\n })}\n/>;\n')))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/600fab28.48886f91.js b/assets/js/600fab28.48886f91.js deleted file mode 100644 index 7524f194..00000000 --- a/assets/js/600fab28.48886f91.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[437],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>f});var r=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=s(n),m=i,f=d["".concat(c,".").concat(m)]||d[m]||u[m]||o;return n?r.createElement(f,a(a({ref:t},p),{},{components:n})):r.createElement(f,a({ref:t},p))}));function f(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,a=new Array(o);a[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:i,a[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=n(7462),i=(n(7294),n(3905));const o={title:"Dict",sidebar_label:"Dict"},a=void 0,l={unversionedId:"dict",id:"dict",title:"Dict",description:"Dict.entries(dict)",source:"@site/docs/dict.md",sourceDirName:".",slug:"/dict",permalink:"/boxed/dict",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/dict.md",tags:[],version:"current",frontMatter:{title:"Dict",sidebar_label:"Dict"},sidebar:"docs",previous:{title:"Array",permalink:"/boxed/array"},next:{title:"Lazy",permalink:"/boxed/lazy"}},c={},s=[{value:"Dict.entries(dict)",id:"dictentriesdict",level:2},{value:"Dict.fromEntries(entries)",id:"dictfromentriesentries",level:2},{value:"Dict.keys(dict)",id:"dictkeysdict",level:2},{value:"Dict.values(dict)",id:"dictvaluesdict",level:2},{value:"Dict.fromOptional(dictOfOptions)",id:"dictfromoptionaldictofoptions",level:2}],p={toc:s},d="wrapper";function u(e){let{components:t,...n}=e;return(0,i.kt)(d,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts"},'import { Dict } from "@swan-io/boxed";\n')),(0,i.kt)("h2",{id:"dictentriesdict"},"Dict.entries(dict)"),(0,i.kt)("p",null,"Returns the entries in the dict."),(0,i.kt)("p",null,"Contrary to the TS bindings for ",(0,i.kt)("inlineCode",{parentName:"p"},"Object.entries"),", the types are refined."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const index = Dict.entries({ foo: 1, bar: 2, baz: 3 });\n// [["foo", 1], ["bar", 2], ["baz", 3]];\n')),(0,i.kt)("h2",{id:"dictfromentriesentries"},"Dict.fromEntries(entries)"),(0,i.kt)("p",null,"Returns a dict from the provided ",(0,i.kt)("inlineCode",{parentName:"p"},"[key, value]")," pairs."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const dict = Dict.fromEntries([\n ["foo", 1],\n ["bar", 2],\n ["baz", 3],\n]);\n// { foo: 1, bar: 2, baz: 3 };\n')),(0,i.kt)("h2",{id:"dictkeysdict"},"Dict.keys(dict)"),(0,i.kt)("p",null,"Returns the keys in the dict."),(0,i.kt)("p",null,"Contrary to the TS bindings for ",(0,i.kt)("inlineCode",{parentName:"p"},"Object.keys"),", the types are refined."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const index = Dict.keys({ foo: 1, bar: 2, baz: 3 });\n// ["foo", "bar", "baz"];\n')),(0,i.kt)("h2",{id:"dictvaluesdict"},"Dict.values(dict)"),(0,i.kt)("p",null,"Returns the values in the dict."),(0,i.kt)("p",null,"Contrary to the TS bindings for ",(0,i.kt)("inlineCode",{parentName:"p"},"Object.values"),", the types are refined."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const index = Dict.values({ foo: 1, bar: 2, baz: 3 });\n// [1, 2, 3];\n")),(0,i.kt)("h2",{id:"dictfromoptionaldictofoptions"},"Dict.fromOptional(dictOfOptions)"),(0,i.kt)("p",null,"Takes a dict whose values are ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," and returns a dict containing only the values contained in ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Dict.fromOptional({\n foo: Option.Some(1),\n bar: Option.None(),\n baz: Option.None(),\n});\n// {foo: 1}\n\nDict.fromOptional({\n foo: Option.Some(1),\n bar: Option.Some(2),\n baz: Option.None(),\n});\n// {foo: 1, bar: 2}\n\nDict.fromOptional({\n foo: Option.None(),\n bar: Option.None(),\n baz: Option.None(),\n});\n// {}\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/600fab28.d6655ba4.js b/assets/js/600fab28.d6655ba4.js new file mode 100644 index 00000000..67da1cfa --- /dev/null +++ b/assets/js/600fab28.d6655ba4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[437],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>f});var r=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=s(n),m=i,f=d["".concat(c,".").concat(m)]||d[m]||u[m]||a;return n?r.createElement(f,o(o({ref:t},p),{},{components:n})):r.createElement(f,o({ref:t},p))}));function f(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:i,o[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var r=n(7462),i=(n(7294),n(3905));const a={title:"Dict",sidebar_label:"Dict"},o=void 0,l={unversionedId:"dict",id:"dict",title:"Dict",description:"Dict.entries(dict)",source:"@site/docs/dict.md",sourceDirName:".",slug:"/dict",permalink:"/dict",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/dict.md",tags:[],version:"current",frontMatter:{title:"Dict",sidebar_label:"Dict"},sidebar:"docs",previous:{title:"Array",permalink:"/array"},next:{title:"Lazy",permalink:"/lazy"}},c={},s=[{value:"Dict.entries(dict)",id:"dictentriesdict",level:2},{value:"Dict.fromEntries(entries)",id:"dictfromentriesentries",level:2},{value:"Dict.keys(dict)",id:"dictkeysdict",level:2},{value:"Dict.values(dict)",id:"dictvaluesdict",level:2},{value:"Dict.fromOptional(dictOfOptions)",id:"dictfromoptionaldictofoptions",level:2}],p={toc:s},d="wrapper";function u(e){let{components:t,...n}=e;return(0,i.kt)(d,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts"},'import { Dict } from "@swan-io/boxed";\n')),(0,i.kt)("h2",{id:"dictentriesdict"},"Dict.entries(dict)"),(0,i.kt)("p",null,"Returns the entries in the dict."),(0,i.kt)("p",null,"Contrary to the TS bindings for ",(0,i.kt)("inlineCode",{parentName:"p"},"Object.entries"),", the types are refined."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const index = Dict.entries({ foo: 1, bar: 2, baz: 3 });\n// [["foo", 1], ["bar", 2], ["baz", 3]];\n')),(0,i.kt)("h2",{id:"dictfromentriesentries"},"Dict.fromEntries(entries)"),(0,i.kt)("p",null,"Returns a dict from the provided ",(0,i.kt)("inlineCode",{parentName:"p"},"[key, value]")," pairs."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const dict = Dict.fromEntries([\n ["foo", 1],\n ["bar", 2],\n ["baz", 3],\n]);\n// { foo: 1, bar: 2, baz: 3 };\n')),(0,i.kt)("h2",{id:"dictkeysdict"},"Dict.keys(dict)"),(0,i.kt)("p",null,"Returns the keys in the dict."),(0,i.kt)("p",null,"Contrary to the TS bindings for ",(0,i.kt)("inlineCode",{parentName:"p"},"Object.keys"),", the types are refined."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const index = Dict.keys({ foo: 1, bar: 2, baz: 3 });\n// ["foo", "bar", "baz"];\n')),(0,i.kt)("h2",{id:"dictvaluesdict"},"Dict.values(dict)"),(0,i.kt)("p",null,"Returns the values in the dict."),(0,i.kt)("p",null,"Contrary to the TS bindings for ",(0,i.kt)("inlineCode",{parentName:"p"},"Object.values"),", the types are refined."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const index = Dict.values({ foo: 1, bar: 2, baz: 3 });\n// [1, 2, 3];\n")),(0,i.kt)("h2",{id:"dictfromoptionaldictofoptions"},"Dict.fromOptional(dictOfOptions)"),(0,i.kt)("p",null,"Takes a dict whose values are ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," and returns a dict containing only the values contained in ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Dict.fromOptional({\n foo: Option.Some(1),\n bar: Option.None(),\n baz: Option.None(),\n});\n// {foo: 1}\n\nDict.fromOptional({\n foo: Option.Some(1),\n bar: Option.Some(2),\n baz: Option.None(),\n});\n// {foo: 1, bar: 2}\n\nDict.fromOptional({\n foo: Option.None(),\n bar: Option.None(),\n baz: Option.None(),\n});\n// {}\n")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/618f8fb4.35414e09.js b/assets/js/618f8fb4.35414e09.js new file mode 100644 index 00000000..4a38f885 --- /dev/null +++ b/assets/js/618f8fb4.35414e09.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[476],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>N});var a=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var r=a.createContext({}),m=function(e){var t=a.useContext(r),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=m(e.components);return a.createElement(r.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,r=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),s=m(n),k=l,N=s["".concat(r,".").concat(k)]||s[k]||d[k]||o;return n?a.createElement(N,i(i({ref:t},u),{},{components:n})):a.createElement(N,i({ref:t},u))}));function N(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,i=new Array(o);i[0]=k;var p={};for(var r in t)hasOwnProperty.call(t,r)&&(p[r]=t[r]);p.originalType=e,p[s]="string"==typeof e?e:l,i[1]=p;for(var m=2;m{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>p,toc:()=>m});var a=n(7462),l=(n(7294),n(3905));const o={title:"Option",sidebar_label:"Option"},i=void 0,p={unversionedId:"option",id:"option",title:"Option",description:"The Option type can be used as a replacement for null and undefined when manipulating optional data. Contrary to null and undefined, an option is kind of like a box, that contains a value or not.",source:"@site/docs/option.md",sourceDirName:".",slug:"/option",permalink:"/option",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/option.md",tags:[],version:"current",frontMatter:{title:"Option",sidebar_label:"Option"},sidebar:"docs",previous:{title:"Design choices",permalink:"/design-choices"},next:{title:"Result",permalink:"/result"}},r={},m=[{value:"Create an Option value",id:"create-an-option-value",level:2},{value:"Methods",id:"methods",level:2},{value:".map(f)",id:"mapf",level:3},{value:".flatMap(f)",id:"flatmapf",level:3},{value:".filter(f)",id:"filterf",level:3},{value:".getOr(defaultValue)",id:"getordefaultvalue",level:3},{value:".mapOr(defaultValue, mapper)",id:"mapordefaultvalue-mapper",level:3},{value:".orElse(option)",id:"orelseoption",level:3},{value:".get()",id:"get",level:3},{value:".isSome()",id:"issome",level:3},{value:".isNone()",id:"isnone",level:3},{value:".toNull()",id:"tonull",level:3},{value:".toUndefined()",id:"toundefined",level:3},{value:".toResult(errorWhenNone)",id:"toresulterrorwhennone",level:3},{value:".match()",id:"match",level:3},{value:".tap(func)",id:"tapfunc",level:3},{value:".tapSome(func)",id:"tapsomefunc",level:3},{value:"Statics",id:"statics",level:2},{value:"Option.fromNullable(value)",id:"optionfromnullablevalue",level:3},{value:"Option.fromNull(value)",id:"optionfromnullvalue",level:3},{value:"Option.fromUndefined(value)",id:"optionfromundefinedvalue",level:3},{value:"Option.fromPredicate(value, predicate)",id:"optionfrompredicatevalue-predicate",level:3},{value:"Option.isOption(value)",id:"optionisoptionvalue",level:3},{value:"Option.all(options)",id:"optionalloptions",level:3},{value:"Option.allFromDict(options)",id:"optionallfromdictoptions",level:3},{value:"TS Pattern interop",id:"ts-pattern-interop",level:2},{value:"Cheatsheet",id:"cheatsheet",level:2}],u={toc:m},s="wrapper";function d(e){let{components:t,...n}=e;return(0,l.kt)(s,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"The ",(0,l.kt)("inlineCode",{parentName:"p"},"Option")," type can be used as a replacement for ",(0,l.kt)("inlineCode",{parentName:"p"},"null")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined")," when manipulating optional data. Contrary to ",(0,l.kt)("inlineCode",{parentName:"p"},"null")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined"),", an option is kind of like a box, that contains a value or not."),(0,l.kt)("p",null,"It can be useful to distinguish values between each other: you can represent ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(None)")," with options, whereas ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined")," or ",(0,l.kt)("inlineCode",{parentName:"p"},"null")," replace the value they intend to make optional."),(0,l.kt)("p",null,"An option can have two possible states:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Some(value)")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"None"))),(0,l.kt)("h2",{id:"create-an-option-value"},"Create an Option value"),(0,l.kt)("p",null,"To create an option, use the ",(0,l.kt)("inlineCode",{parentName:"p"},"Some")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"None")," constructors:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},'import { Option } from "@swan-io/boxed";\n\nconst aName = Option.Some("John");\nconst bName = Option.None();\n\n// You can enforce the type using a type parameter\nOption.Some("John");\nOption.None();\n')),(0,l.kt)("p",null,"You get interop with ",(0,l.kt)("inlineCode",{parentName:"p"},"null")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined"),":"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"// `value` being `null` or `undefined` makes a `None`\nconst a = Option.fromNullable(value);\n\n// `value` being `null` makes a `None`\nconst b = Option.fromNull(value);\n\n// `value` being `undefined` makes a `None`\nconst c = Option.fromUndefined(value);\n")),(0,l.kt)("admonition",{title:"Since v3.0.0",type:"tip"},(0,l.kt)("p",{parentName:"admonition"},(0,l.kt)("inlineCode",{parentName:"p"},"Option")," values are referentially equal if they contain the same value, meaning that ",(0,l.kt)("inlineCode",{parentName:"p"},"Option.Some(1) === Option.Some(1)"),".")),(0,l.kt)("h2",{id:"methods"},"Methods"),(0,l.kt)("p",null,"The option type provides a few manipulation functions:"),(0,l.kt)("h3",{id:"mapf"},".map(f)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.map(f: (value: A) => B): Option\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(f(value))"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"None"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).map((x) => x * 2);\n// Option.Some<4>\n\nOption.None().map((x) => x * 2);\n// Option.None\n")),(0,l.kt)("h3",{id:"flatmapf"},".flatMap(f)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.flatMap(f: (value: A) => Option): Option\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"f(value)"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"None"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(3).flatMap((x) => (x > 2 ? Option.None() : Option.Some(2)));\n// Option.None\n\nOption.Some(1).flatMap((x) => (x > 2 ? Option.None() : Option.Some(2)));\n// Option.Some<2>\n\noption.flatMap((value) => value.optionalProperty);\n// Option\n")),(0,l.kt)("h3",{id:"filterf"},".filter(f)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.filter(f: (value: A) => boolean): Option\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," and that ",(0,l.kt)("inlineCode",{parentName:"p"},"f(value)")," is ",(0,l.kt)("inlineCode",{parentName:"p"},"true"),", returns ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"None"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(3).filter((x) => x > 2);\n// Option.Some(3)\n\nOption.Some(1).filter((x) => x > 2);\n// Option.None\n")),(0,l.kt)("h3",{id:"getordefaultvalue"},".getOr(defaultValue)"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"Alias: ",(0,l.kt)("inlineCode",{parentName:"p"},"getWithDefault"))),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.getOr(defaultValue: A): A\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"value"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"defaultValue"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).getOr(1);\n// 2\n\nOption.None().getOr(1);\n// 1\n")),(0,l.kt)("h3",{id:"mapordefaultvalue-mapper"},".mapOr(defaultValue, mapper)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.mapOr(defaultValue: B, mapper: (a: A) => B): B\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"mapper(value)"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"defaultValue"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).mapOr(1, (x) => x * 2);\n// 4\n\nOption.None().mapOr(1, (x) => x * 2);\n// 1\n")),(0,l.kt)("h3",{id:"orelseoption"},".orElse(option)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.orElse(fallback: Option): Option\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," return it, otherwise return the fallback value."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).orElse(Option.Some(3));\n// Some<2>\n\nOption.Some(2).orElse(Option.None());\n// Some<2>\n\nOption.None().orElse(Option.Some(3));\n// Some<3>\n\nOption.None().orElse(Option.None());\n// None\n")),(0,l.kt)("h3",{id:"get"},".get()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.get(): A\n")),(0,l.kt)("p",null,"Returns the value contained in ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)"),". Only usable within a ",(0,l.kt)("inlineCode",{parentName:"p"},"isSome()")," check."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const value = option.get();\n// does not compile\n\nif (option.isSome()) {\n const value = option.get();\n // value\n}\n")),(0,l.kt)("h3",{id:"issome"},".isSome()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.isSome(): boolean\n")),(0,l.kt)("p",null,"Type guard. Checks if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).isSome();\n// true\n\nOption.None().isSome();\n// false\n\nif (option.isSome()) {\n const value = option.get();\n}\n")),(0,l.kt)("h3",{id:"isnone"},".isNone()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.isNone(): boolean\n")),(0,l.kt)("p",null,"Type guard. Checks if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"None")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).isNone();\n// false\n\nOption.None().isNone();\n// true\n")),(0,l.kt)("h3",{id:"tonull"},".toNull()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.toNull(): A | null\n")),(0,l.kt)("p",null,"Returns ",(0,l.kt)("inlineCode",{parentName:"p"},"null")," if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"None"),", returns the value otherwise"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).toNull();\n// 2\n\nOption.None().toNull();\n// null\n")),(0,l.kt)("h3",{id:"toundefined"},".toUndefined()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.toUndefined(): A | undefined\n")),(0,l.kt)("p",null,"Returns ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined")," if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"None"),", returns the value otherwise"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).toUndefined();\n// 2\n\nOption.None().toUndefined();\n// undefined\n")),(0,l.kt)("h3",{id:"toresulterrorwhennone"},".toResult(errorWhenNone)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.toResult(valueWhenNone: E): Result\n")),(0,l.kt)("p",null,"Returns ",(0,l.kt)("inlineCode",{parentName:"p"},"Ok")," if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some"),", returns ",(0,l.kt)("inlineCode",{parentName:"p"},"Error")," otherwise"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const a = Option.Some(1).toResult("NotFound");\n// Ok<1>\n\nconst b = Option.None().toResult("NotFound");\n// Error<"NotFound">\n')),(0,l.kt)("h3",{id:"match"},".match()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.match(config: {\n Some: (value: A) => B;\n None: () => B;\n}): B\n")),(0,l.kt)("p",null,"Match the option state"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const valueToDisplay = option.match({\n Some: (value) => value,\n None: () => "No value",\n});\n// value | "No value"\n')),(0,l.kt)("h3",{id:"tapfunc"},".tap(func)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.tap(func: (option: Option) => unknown): Option\n")),(0,l.kt)("p",null,"Executes ",(0,l.kt)("inlineCode",{parentName:"p"},"func")," with ",(0,l.kt)("inlineCode",{parentName:"p"},"option"),", and returns ",(0,l.kt)("inlineCode",{parentName:"p"},"option"),". Useful for logging and debugging."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"option.tap(console.log).map((x) => x * 2);\n")),(0,l.kt)("h3",{id:"tapsomefunc"},".tapSome(func)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.tapSome(func: (option: A) => unknown): Option\n")),(0,l.kt)("p",null,"Executes ",(0,l.kt)("inlineCode",{parentName:"p"},"func")," with ",(0,l.kt)("inlineCode",{parentName:"p"},"option"),"'s value if ",(0,l.kt)("inlineCode",{parentName:"p"},"Some"),", and returns ",(0,l.kt)("inlineCode",{parentName:"p"},"option"),". Useful for logging and debugging."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"option.tapSome(console.log).map((x) => x * 2);\n")),(0,l.kt)("h2",{id:"statics"},"Statics"),(0,l.kt)("h3",{id:"optionfromnullablevalue"},"Option.fromNullable(value)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"fromNullable(nullable: A | null | undefined): Option\n")),(0,l.kt)("p",null,"Creates an option from a nullable value, excluding ",(0,l.kt)("inlineCode",{parentName:"p"},"null")," & ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.fromNullable(null);\n// Option.None()\n\nOption.fromNullable(undefined);\n// Option.None()\n\nOption.fromNullable(1);\n// Option.Some(1)\n")),(0,l.kt)("h3",{id:"optionfromnullvalue"},"Option.fromNull(value)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"fromNull(nullable: A | null): Option\n")),(0,l.kt)("p",null,"Creates an option from a nullable value, excluding ",(0,l.kt)("inlineCode",{parentName:"p"},"null")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.fromNull(null);\n// Option.None()\n\nOption.fromNull(undefined);\n// Option.Some(undefined)\n\nOption.fromNull(1);\n// Option.Some(1)\n")),(0,l.kt)("h3",{id:"optionfromundefinedvalue"},"Option.fromUndefined(value)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"fromUndefined(nullable: A | undefined): Option\n")),(0,l.kt)("p",null,"Creates an option from a nullable value, excluding ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.fromUndefined(null);\n// Option.Some(null)\n\nOption.fromUndefined(undefined);\n// Option.None()\n\nOption.fromUndefined(1);\n// Option.Some(1)\n")),(0,l.kt)("h3",{id:"optionfrompredicatevalue-predicate"},"Option.fromPredicate(value, predicate)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"fromPredicate(value: A, f: (value: A) => boolean): Option\n")),(0,l.kt)("p",null,"Creates an option from a value and a predicate. Will return ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," if predicate returns ",(0,l.kt)("inlineCode",{parentName:"p"},"true"),", ",(0,l.kt)("inlineCode",{parentName:"p"},"None")," if ",(0,l.kt)("inlineCode",{parentName:"p"},"false")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.fromPredicate(value, (value) => value % 2 === 0);\n// Option where `number` is even\n")),(0,l.kt)("h3",{id:"optionisoptionvalue"},"Option.isOption(value)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"isOption(value: unknown): boolean\n")),(0,l.kt)("p",null,"Type guard, checks if the provided value is an option."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.isOption(Option.Some(1));\n// true\n\nOption.isOption([]);\n// false\n")),(0,l.kt)("h3",{id:"optionalloptions"},"Option.all(options)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"all(options: Array>): Option>\n")),(0,l.kt)("p",null,'Turns an "array of options of value" into a "option of array of value".'),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.all([Option.Some(1), Option.Some(2), Option.Some(3)]);\n// Some([1, 2, 3])\n\nOption.all([Option.None(), Option.Some(2), Option.Some(3)]);\n// None\n")),(0,l.kt)("h3",{id:"optionallfromdictoptions"},"Option.allFromDict(options)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"allFromDict(options: Dict>): Option>\n")),(0,l.kt)("p",null,'Turns a "dict of options of value" into a "option of dict of value".'),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.allFromDict({ a: Option.Some(1), b: Option.Some(2), c: Option.Some(3) });\n// Some({a: 1, b: 2, c: 3})\n\nOption.allFromDict({ a: Option.None(), b: Option.Some(2), c: Option.Some(3) });\n// None\n")),(0,l.kt)("h2",{id:"ts-pattern-interop"},"TS Pattern interop"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'import { match, P } from "ts-pattern";\nimport { Option } from "@swan-io/boxed";\n\nmatch(myOption)\n .with(Option.P.Some(P.select()), (value) => console.log(value))\n .with(Option.P.None, () => "No value")\n .exhaustive();\n')),(0,l.kt)("h2",{id:"cheatsheet"},"Cheatsheet"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Method"),(0,l.kt)("th",{parentName:"tr",align:null},"Input"),(0,l.kt)("th",{parentName:"tr",align:null},"Function input"),(0,l.kt)("th",{parentName:"tr",align:null},"Function output"),(0,l.kt)("th",{parentName:"tr",align:null},"Returned value"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#mapf"},(0,l.kt)("inlineCode",{parentName:"a"},"map"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Some(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"y")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Some(y)"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#mapf"},(0,l.kt)("inlineCode",{parentName:"a"},"map"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"None()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not provided")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not executed")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"None()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Some(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Some(y)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Some(y)"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Some(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"None()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"None()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"None()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not provided")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not executed")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"None()"))))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/618f8fb4.def620e5.js b/assets/js/618f8fb4.def620e5.js deleted file mode 100644 index 21aa47a6..00000000 --- a/assets/js/618f8fb4.def620e5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[476],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>N});var a=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var r=a.createContext({}),m=function(e){var t=a.useContext(r),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=m(e.components);return a.createElement(r.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,r=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),s=m(n),k=l,N=s["".concat(r,".").concat(k)]||s[k]||d[k]||o;return n?a.createElement(N,i(i({ref:t},u),{},{components:n})):a.createElement(N,i({ref:t},u))}));function N(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,i=new Array(o);i[0]=k;var p={};for(var r in t)hasOwnProperty.call(t,r)&&(p[r]=t[r]);p.originalType=e,p[s]="string"==typeof e?e:l,i[1]=p;for(var m=2;m{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>p,toc:()=>m});var a=n(7462),l=(n(7294),n(3905));const o={title:"Option",sidebar_label:"Option"},i=void 0,p={unversionedId:"option",id:"option",title:"Option",description:"The Option type can be used as a replacement for null and undefined when manipulating optional data. Contrary to null and undefined, an option is kind of like a box, that contains a value or not.",source:"@site/docs/option.md",sourceDirName:".",slug:"/option",permalink:"/boxed/option",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/option.md",tags:[],version:"current",frontMatter:{title:"Option",sidebar_label:"Option"},sidebar:"docs",previous:{title:"Design choices",permalink:"/boxed/design-choices"},next:{title:"Result",permalink:"/boxed/result"}},r={},m=[{value:"Create an Option value",id:"create-an-option-value",level:2},{value:"Methods",id:"methods",level:2},{value:".map(f)",id:"mapf",level:3},{value:".flatMap(f)",id:"flatmapf",level:3},{value:".filter(f)",id:"filterf",level:3},{value:".getOr(defaultValue)",id:"getordefaultvalue",level:3},{value:".mapOr(defaultValue, mapper)",id:"mapordefaultvalue-mapper",level:3},{value:".orElse(option)",id:"orelseoption",level:3},{value:".get()",id:"get",level:3},{value:".isSome()",id:"issome",level:3},{value:".isNone()",id:"isnone",level:3},{value:".toNull()",id:"tonull",level:3},{value:".toUndefined()",id:"toundefined",level:3},{value:".toResult(errorWhenNone)",id:"toresulterrorwhennone",level:3},{value:".match()",id:"match",level:3},{value:".tap(func)",id:"tapfunc",level:3},{value:".tapSome(func)",id:"tapsomefunc",level:3},{value:"Statics",id:"statics",level:2},{value:"Option.fromNullable(value)",id:"optionfromnullablevalue",level:3},{value:"Option.fromNull(value)",id:"optionfromnullvalue",level:3},{value:"Option.fromUndefined(value)",id:"optionfromundefinedvalue",level:3},{value:"Option.fromPredicate(value, predicate)",id:"optionfrompredicatevalue-predicate",level:3},{value:"Option.isOption(value)",id:"optionisoptionvalue",level:3},{value:"Option.all(options)",id:"optionalloptions",level:3},{value:"Option.allFromDict(options)",id:"optionallfromdictoptions",level:3},{value:"TS Pattern interop",id:"ts-pattern-interop",level:2},{value:"Cheatsheet",id:"cheatsheet",level:2}],u={toc:m},s="wrapper";function d(e){let{components:t,...n}=e;return(0,l.kt)(s,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"The ",(0,l.kt)("inlineCode",{parentName:"p"},"Option")," type can be used as a replacement for ",(0,l.kt)("inlineCode",{parentName:"p"},"null")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined")," when manipulating optional data. Contrary to ",(0,l.kt)("inlineCode",{parentName:"p"},"null")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined"),", an option is kind of like a box, that contains a value or not."),(0,l.kt)("p",null,"It can be useful to distinguish values between each other: you can represent ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(None)")," with options, whereas ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined")," or ",(0,l.kt)("inlineCode",{parentName:"p"},"null")," replace the value they intend to make optional."),(0,l.kt)("p",null,"An option can have two possible states:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Some(value)")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"None"))),(0,l.kt)("h2",{id:"create-an-option-value"},"Create an Option value"),(0,l.kt)("p",null,"To create an option, use the ",(0,l.kt)("inlineCode",{parentName:"p"},"Some")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"None")," constructors:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},'import { Option } from "@swan-io/boxed";\n\nconst aName = Option.Some("John");\nconst bName = Option.None();\n\n// You can enforce the type using a type parameter\nOption.Some("John");\nOption.None();\n')),(0,l.kt)("p",null,"You get interop with ",(0,l.kt)("inlineCode",{parentName:"p"},"null")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined"),":"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"// `value` being `null` or `undefined` makes a `None`\nconst a = Option.fromNullable(value);\n\n// `value` being `null` makes a `None`\nconst b = Option.fromNull(value);\n\n// `value` being `undefined` makes a `None`\nconst c = Option.fromUndefined(value);\n")),(0,l.kt)("admonition",{title:"Since v3.0.0",type:"tip"},(0,l.kt)("p",{parentName:"admonition"},(0,l.kt)("inlineCode",{parentName:"p"},"Option")," values are referentially equal if they contain the same value, meaning that ",(0,l.kt)("inlineCode",{parentName:"p"},"Option.Some(1) === Option.Some(1)"),".")),(0,l.kt)("h2",{id:"methods"},"Methods"),(0,l.kt)("p",null,"The option type provides a few manipulation functions:"),(0,l.kt)("h3",{id:"mapf"},".map(f)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.map(f: (value: A) => B): Option\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(f(value))"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"None"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).map((x) => x * 2);\n// Option.Some<4>\n\nOption.None().map((x) => x * 2);\n// Option.None\n")),(0,l.kt)("h3",{id:"flatmapf"},".flatMap(f)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.flatMap(f: (value: A) => Option): Option\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"f(value)"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"None"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(3).flatMap((x) => (x > 2 ? Option.None() : Option.Some(2)));\n// Option.None\n\nOption.Some(1).flatMap((x) => (x > 2 ? Option.None() : Option.Some(2)));\n// Option.Some<2>\n\noption.flatMap((value) => value.optionalProperty);\n// Option\n")),(0,l.kt)("h3",{id:"filterf"},".filter(f)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.filter(f: (value: A) => boolean): Option\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," and that ",(0,l.kt)("inlineCode",{parentName:"p"},"f(value)")," is ",(0,l.kt)("inlineCode",{parentName:"p"},"true"),", returns ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"None"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(3).filter((x) => x > 2);\n// Option.Some(3)\n\nOption.Some(1).filter((x) => x > 2);\n// Option.None\n")),(0,l.kt)("h3",{id:"getordefaultvalue"},".getOr(defaultValue)"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"Alias: ",(0,l.kt)("inlineCode",{parentName:"p"},"getWithDefault"))),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.getOr(defaultValue: A): A\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"value"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"defaultValue"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).getOr(1);\n// 2\n\nOption.None().getOr(1);\n// 1\n")),(0,l.kt)("h3",{id:"mapordefaultvalue-mapper"},".mapOr(defaultValue, mapper)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.mapOr(defaultValue: B, mapper: (a: A) => B): B\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"mapper(value)"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"defaultValue"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).mapOr(1, (x) => x * 2);\n// 4\n\nOption.None().mapOr(1, (x) => x * 2);\n// 1\n")),(0,l.kt)("h3",{id:"orelseoption"},".orElse(option)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.orElse(fallback: Option): Option\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," return it, otherwise return the fallback value."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).orElse(Option.Some(3));\n// Some<2>\n\nOption.Some(2).orElse(Option.None());\n// Some<2>\n\nOption.None().orElse(Option.Some(3));\n// Some<3>\n\nOption.None().orElse(Option.None());\n// None\n")),(0,l.kt)("h3",{id:"get"},".get()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.get(): A\n")),(0,l.kt)("p",null,"Returns the value contained in ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)"),". Only usable within a ",(0,l.kt)("inlineCode",{parentName:"p"},"isSome()")," check."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const value = option.get();\n// does not compile\n\nif (option.isSome()) {\n const value = option.get();\n // value\n}\n")),(0,l.kt)("h3",{id:"issome"},".isSome()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.isSome(): boolean\n")),(0,l.kt)("p",null,"Type guard. Checks if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).isSome();\n// true\n\nOption.None().isSome();\n// false\n\nif (option.isSome()) {\n const value = option.get();\n}\n")),(0,l.kt)("h3",{id:"isnone"},".isNone()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.isNone(): boolean\n")),(0,l.kt)("p",null,"Type guard. Checks if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"None")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).isNone();\n// false\n\nOption.None().isNone();\n// true\n")),(0,l.kt)("h3",{id:"tonull"},".toNull()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.toNull(): A | null\n")),(0,l.kt)("p",null,"Returns ",(0,l.kt)("inlineCode",{parentName:"p"},"null")," if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"None"),", returns the value otherwise"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).toNull();\n// 2\n\nOption.None().toNull();\n// null\n")),(0,l.kt)("h3",{id:"toundefined"},".toUndefined()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.toUndefined(): A | undefined\n")),(0,l.kt)("p",null,"Returns ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined")," if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"None"),", returns the value otherwise"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.Some(2).toUndefined();\n// 2\n\nOption.None().toUndefined();\n// undefined\n")),(0,l.kt)("h3",{id:"toresulterrorwhennone"},".toResult(errorWhenNone)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.toResult(valueWhenNone: E): Result\n")),(0,l.kt)("p",null,"Returns ",(0,l.kt)("inlineCode",{parentName:"p"},"Ok")," if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Some"),", returns ",(0,l.kt)("inlineCode",{parentName:"p"},"Error")," otherwise"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const a = Option.Some(1).toResult("NotFound");\n// Ok<1>\n\nconst b = Option.None().toResult("NotFound");\n// Error<"NotFound">\n')),(0,l.kt)("h3",{id:"match"},".match()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.match(config: {\n Some: (value: A) => B;\n None: () => B;\n}): B\n")),(0,l.kt)("p",null,"Match the option state"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const valueToDisplay = option.match({\n Some: (value) => value,\n None: () => "No value",\n});\n// value | "No value"\n')),(0,l.kt)("h3",{id:"tapfunc"},".tap(func)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.tap(func: (option: Option) => unknown): Option\n")),(0,l.kt)("p",null,"Executes ",(0,l.kt)("inlineCode",{parentName:"p"},"func")," with ",(0,l.kt)("inlineCode",{parentName:"p"},"option"),", and returns ",(0,l.kt)("inlineCode",{parentName:"p"},"option"),". Useful for logging and debugging."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"option.tap(console.log).map((x) => x * 2);\n")),(0,l.kt)("h3",{id:"tapsomefunc"},".tapSome(func)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"Option.tapSome(func: (option: A) => unknown): Option\n")),(0,l.kt)("p",null,"Executes ",(0,l.kt)("inlineCode",{parentName:"p"},"func")," with ",(0,l.kt)("inlineCode",{parentName:"p"},"option"),"'s value if ",(0,l.kt)("inlineCode",{parentName:"p"},"Some"),", and returns ",(0,l.kt)("inlineCode",{parentName:"p"},"option"),". Useful for logging and debugging."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"option.tapSome(console.log).map((x) => x * 2);\n")),(0,l.kt)("h2",{id:"statics"},"Statics"),(0,l.kt)("h3",{id:"optionfromnullablevalue"},"Option.fromNullable(value)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"fromNullable(nullable: A | null | undefined): Option\n")),(0,l.kt)("p",null,"Creates an option from a nullable value, excluding ",(0,l.kt)("inlineCode",{parentName:"p"},"null")," & ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.fromNullable(null);\n// Option.None()\n\nOption.fromNullable(undefined);\n// Option.None()\n\nOption.fromNullable(1);\n// Option.Some(1)\n")),(0,l.kt)("h3",{id:"optionfromnullvalue"},"Option.fromNull(value)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"fromNull(nullable: A | null): Option\n")),(0,l.kt)("p",null,"Creates an option from a nullable value, excluding ",(0,l.kt)("inlineCode",{parentName:"p"},"null")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.fromNull(null);\n// Option.None()\n\nOption.fromNull(undefined);\n// Option.Some(undefined)\n\nOption.fromNull(1);\n// Option.Some(1)\n")),(0,l.kt)("h3",{id:"optionfromundefinedvalue"},"Option.fromUndefined(value)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"fromUndefined(nullable: A | undefined): Option\n")),(0,l.kt)("p",null,"Creates an option from a nullable value, excluding ",(0,l.kt)("inlineCode",{parentName:"p"},"undefined")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.fromUndefined(null);\n// Option.Some(null)\n\nOption.fromUndefined(undefined);\n// Option.None()\n\nOption.fromUndefined(1);\n// Option.Some(1)\n")),(0,l.kt)("h3",{id:"optionfrompredicatevalue-predicate"},"Option.fromPredicate(value, predicate)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"fromPredicate(value: A, f: (value: A) => boolean): Option\n")),(0,l.kt)("p",null,"Creates an option from a value and a predicate. Will return ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)")," if predicate returns ",(0,l.kt)("inlineCode",{parentName:"p"},"true"),", ",(0,l.kt)("inlineCode",{parentName:"p"},"None")," if ",(0,l.kt)("inlineCode",{parentName:"p"},"false")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.fromPredicate(value, (value) => value % 2 === 0);\n// Option where `number` is even\n")),(0,l.kt)("h3",{id:"optionisoptionvalue"},"Option.isOption(value)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"isOption(value: unknown): boolean\n")),(0,l.kt)("p",null,"Type guard, checks if the provided value is an option."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.isOption(Option.Some(1));\n// true\n\nOption.isOption([]);\n// false\n")),(0,l.kt)("h3",{id:"optionalloptions"},"Option.all(options)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"all(options: Array>): Option>\n")),(0,l.kt)("p",null,'Turns an "array of options of value" into a "option of array of value".'),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.all([Option.Some(1), Option.Some(2), Option.Some(3)]);\n// Some([1, 2, 3])\n\nOption.all([Option.None(), Option.Some(2), Option.Some(3)]);\n// None\n")),(0,l.kt)("h3",{id:"optionallfromdictoptions"},"Option.allFromDict(options)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"allFromDict(options: Dict>): Option>\n")),(0,l.kt)("p",null,'Turns a "dict of options of value" into a "option of dict of value".'),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Option.allFromDict({ a: Option.Some(1), b: Option.Some(2), c: Option.Some(3) });\n// Some({a: 1, b: 2, c: 3})\n\nOption.allFromDict({ a: Option.None(), b: Option.Some(2), c: Option.Some(3) });\n// None\n")),(0,l.kt)("h2",{id:"ts-pattern-interop"},"TS Pattern interop"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'import { match, P } from "ts-pattern";\nimport { Option } from "@swan-io/boxed";\n\nmatch(myOption)\n .with(Option.P.Some(P.select()), (value) => console.log(value))\n .with(Option.P.None, () => "No value")\n .exhaustive();\n')),(0,l.kt)("h2",{id:"cheatsheet"},"Cheatsheet"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Method"),(0,l.kt)("th",{parentName:"tr",align:null},"Input"),(0,l.kt)("th",{parentName:"tr",align:null},"Function input"),(0,l.kt)("th",{parentName:"tr",align:null},"Function output"),(0,l.kt)("th",{parentName:"tr",align:null},"Returned value"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#mapf"},(0,l.kt)("inlineCode",{parentName:"a"},"map"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Some(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"y")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Some(y)"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#mapf"},(0,l.kt)("inlineCode",{parentName:"a"},"map"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"None()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not provided")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not executed")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"None()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Some(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Some(y)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Some(y)"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Some(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"None()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"None()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"None()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not provided")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not executed")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"None()"))))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/75a55335.70de1b18.js b/assets/js/75a55335.70de1b18.js deleted file mode 100644 index a051312d..00000000 --- a/assets/js/75a55335.70de1b18.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[109],{3905:(e,n,t)=>{t.d(n,{Zo:()=>u,kt:()=>m});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var p=r.createContext({}),s=function(e){var n=r.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},u=function(e){var n=s(e.components);return r.createElement(p.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},f=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=s(t),f=a,m=d["".concat(p,".").concat(f)]||d[f]||c[f]||i;return t?r.createElement(m,l(l({ref:n},u),{},{components:t})):r.createElement(m,l({ref:n},u))}));function m(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,l=new Array(i);l[0]=f;var o={};for(var p in n)hasOwnProperty.call(n,p)&&(o[p]=n[p]);o.originalType=e,o[d]="string"==typeof e?e:a,l[1]=o;for(var s=2;s{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var r=t(7462),a=(t(7294),t(3905));const i={title:"Nested optional values",sidebar_label:"Nested optional values"},l=void 0,o={unversionedId:"nested-optional-values",id:"nested-optional-values",title:"Nested optional values",description:"Managing optionality with undefined and null can lead to tedious code, especially when dealing with default values.",source:"@site/docs/nested-optional-values.md",sourceDirName:".",slug:"/nested-optional-values",permalink:"/boxed/nested-optional-values",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/nested-optional-values.md",tags:[],version:"current",frontMatter:{title:"Nested optional values",sidebar_label:"Nested optional values"},sidebar:"docs",previous:{title:"Form Validation",permalink:"/boxed/form-validation"},next:{title:"Cancellable Request",permalink:"/boxed/cancellable-request"}},p={},s=[],u={toc:s},d="wrapper";function c(e){let{components:n,...t}=e;return(0,a.kt)(d,(0,r.Z)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Managing optionality with ",(0,a.kt)("inlineCode",{parentName:"p"},"undefined")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"null")," can lead to tedious code, especially when dealing with default values."),(0,a.kt)("p",null,"Let's assume that we have the following values in scope:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"declare var input: string | undefined;\ndeclare function parseInput(input: string): Array;\ndeclare function transform(input: Array): Array | undefined;\ndeclare function print(input: Array): string;\ndeclare function prettify(input: string): string;\n")),(0,a.kt)("p",null,"Here, ",(0,a.kt)("inlineCode",{parentName:"p"},"parse")," always returns an ",(0,a.kt)("inlineCode",{parentName:"p"},"Array"),", and ",(0,a.kt)("inlineCode",{parentName:"p"},"transform")," can return either an ",(0,a.kt)("inlineCode",{parentName:"p"},"Array")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"undefined"),"."),(0,a.kt)("p",null,"Handling this using ",(0,a.kt)("inlineCode",{parentName:"p"},"null")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"undefined")," values would lead to code like the following:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'const parsed = input != undefined ? parseInput(input) : undefined;\n// Keep the `parsed` value if `transform` doesn\'t output\nconst transformed =\n parsed != undefined ? transform(parsed) ?? parsed : undefined;\n// Fallback at the end\nconst printed = transformed != undefined ? print(transformed) : undefined;\nconst value = printed != undefined ? prettify(printed) : "fallback";\n')),(0,a.kt)("p",null,"We lose a lot of the code intent, as we're distracted with some unnecessary complexity."),(0,a.kt)("p",null,"Now, let's tweak our values so that we use the ",(0,a.kt)("inlineCode",{parentName:"p"},"Option")," type instead of ",(0,a.kt)("inlineCode",{parentName:"p"},"undefined"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"declare var input: Option;\ndeclare function parseInput(input: string): Array;\ndeclare function transform(input: Array): Option>;\ndeclare function print(input: Array): string;\ndeclare function prettify(input: string): string;\n")),(0,a.kt)("p",null,"Using ",(0,a.kt)("inlineCode",{parentName:"p"},"Option"),", the same code as above can be written as follows:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'input\n .map(parseInput)\n .flatMap(transform)\n .map(print)\n .map(prettify)\n .getOr("fallback");\n')),(0,a.kt)("p",null,"Here, the ",(0,a.kt)("strong",{parentName:"p"},"intent")," of the code is clearly represented, making it much easier to follow."),(0,a.kt)("p",null,"If we need quick interop with existing code returning ",(0,a.kt)("inlineCode",{parentName:"p"},"undefined")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"null")," values, Boxed provides transformers:"),(0,a.kt)("p",null,"If we were to assume again that we have:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"declare var input: string | undefined;\ndeclare function parseInput(input: string): Array;\ndeclare function transform(input: Array): Array | undefined;\ndeclare function print(input: Array): string;\ndeclare function prettify(input: string): string;\n")),(0,a.kt)("p",null,"We'd simplfy need to write the following:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'Option.fromNullable(input)\n .map(parseInput)\n .flatMap((input) => Option.fromNullable(transform(input)))\n .map(print)\n .map(prettify)\n .getOr("fallback");\n')))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/75a55335.e5088ece.js b/assets/js/75a55335.e5088ece.js new file mode 100644 index 00000000..38684e23 --- /dev/null +++ b/assets/js/75a55335.e5088ece.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[109],{3905:(e,n,t)=>{t.d(n,{Zo:()=>u,kt:()=>m});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var p=r.createContext({}),s=function(e){var n=r.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},u=function(e){var n=s(e.components);return r.createElement(p.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},f=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=s(t),f=a,m=d["".concat(p,".").concat(f)]||d[f]||c[f]||i;return t?r.createElement(m,l(l({ref:n},u),{},{components:t})):r.createElement(m,l({ref:n},u))}));function m(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,l=new Array(i);l[0]=f;var o={};for(var p in n)hasOwnProperty.call(n,p)&&(o[p]=n[p]);o.originalType=e,o[d]="string"==typeof e?e:a,l[1]=o;for(var s=2;s{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var r=t(7462),a=(t(7294),t(3905));const i={title:"Nested optional values",sidebar_label:"Nested optional values"},l=void 0,o={unversionedId:"nested-optional-values",id:"nested-optional-values",title:"Nested optional values",description:"Managing optionality with undefined and null can lead to tedious code, especially when dealing with default values.",source:"@site/docs/nested-optional-values.md",sourceDirName:".",slug:"/nested-optional-values",permalink:"/nested-optional-values",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/nested-optional-values.md",tags:[],version:"current",frontMatter:{title:"Nested optional values",sidebar_label:"Nested optional values"},sidebar:"docs",previous:{title:"Form Validation",permalink:"/form-validation"},next:{title:"Cancellable Request",permalink:"/cancellable-request"}},p={},s=[],u={toc:s},d="wrapper";function c(e){let{components:n,...t}=e;return(0,a.kt)(d,(0,r.Z)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Managing optionality with ",(0,a.kt)("inlineCode",{parentName:"p"},"undefined")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"null")," can lead to tedious code, especially when dealing with default values."),(0,a.kt)("p",null,"Let's assume that we have the following values in scope:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"declare var input: string | undefined;\ndeclare function parseInput(input: string): Array;\ndeclare function transform(input: Array): Array | undefined;\ndeclare function print(input: Array): string;\ndeclare function prettify(input: string): string;\n")),(0,a.kt)("p",null,"Here, ",(0,a.kt)("inlineCode",{parentName:"p"},"parse")," always returns an ",(0,a.kt)("inlineCode",{parentName:"p"},"Array"),", and ",(0,a.kt)("inlineCode",{parentName:"p"},"transform")," can return either an ",(0,a.kt)("inlineCode",{parentName:"p"},"Array")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"undefined"),"."),(0,a.kt)("p",null,"Handling this using ",(0,a.kt)("inlineCode",{parentName:"p"},"null")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"undefined")," values would lead to code like the following:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'const parsed = input != undefined ? parseInput(input) : undefined;\n// Keep the `parsed` value if `transform` doesn\'t output\nconst transformed =\n parsed != undefined ? transform(parsed) ?? parsed : undefined;\n// Fallback at the end\nconst printed = transformed != undefined ? print(transformed) : undefined;\nconst value = printed != undefined ? prettify(printed) : "fallback";\n')),(0,a.kt)("p",null,"We lose a lot of the code intent, as we're distracted with some unnecessary complexity."),(0,a.kt)("p",null,"Now, let's tweak our values so that we use the ",(0,a.kt)("inlineCode",{parentName:"p"},"Option")," type instead of ",(0,a.kt)("inlineCode",{parentName:"p"},"undefined"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"declare var input: Option;\ndeclare function parseInput(input: string): Array;\ndeclare function transform(input: Array): Option>;\ndeclare function print(input: Array): string;\ndeclare function prettify(input: string): string;\n")),(0,a.kt)("p",null,"Using ",(0,a.kt)("inlineCode",{parentName:"p"},"Option"),", the same code as above can be written as follows:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'input\n .map(parseInput)\n .flatMap(transform)\n .map(print)\n .map(prettify)\n .getOr("fallback");\n')),(0,a.kt)("p",null,"Here, the ",(0,a.kt)("strong",{parentName:"p"},"intent")," of the code is clearly represented, making it much easier to follow."),(0,a.kt)("p",null,"If we need quick interop with existing code returning ",(0,a.kt)("inlineCode",{parentName:"p"},"undefined")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"null")," values, Boxed provides transformers:"),(0,a.kt)("p",null,"If we were to assume again that we have:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"declare var input: string | undefined;\ndeclare function parseInput(input: string): Array;\ndeclare function transform(input: Array): Array | undefined;\ndeclare function print(input: Array): string;\ndeclare function prettify(input: string): string;\n")),(0,a.kt)("p",null,"We'd simplfy need to write the following:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'Option.fromNullable(input)\n .map(parseInput)\n .flatMap((input) => Option.fromNullable(transform(input)))\n .map(print)\n .map(prettify)\n .getOr("fallback");\n')))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7958baa0.7ccf143a.js b/assets/js/7958baa0.0ea554af.js similarity index 53% rename from assets/js/7958baa0.7ccf143a.js rename to assets/js/7958baa0.0ea554af.js index 4e44515b..b7128613 100644 --- a/assets/js/7958baa0.7ccf143a.js +++ b/assets/js/7958baa0.0ea554af.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[571],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},s="mdxType",y={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),s=p(r),d=a,m=s["".concat(c,".").concat(d)]||s[d]||y[d]||o;return r?n.createElement(m,l(l({ref:t},u),{},{components:r})):n.createElement(m,l({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:a,l[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>y,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={title:"Lazy",sidebar_label:"Lazy"},l=void 0,i={unversionedId:"lazy",id:"lazy",title:"Lazy",description:"Lazy(f)",source:"@site/docs/lazy.md",sourceDirName:".",slug:"/lazy",permalink:"/boxed/lazy",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/lazy.md",tags:[],version:"current",frontMatter:{title:"Lazy",sidebar_label:"Lazy"},sidebar:"docs",previous:{title:"Dict",permalink:"/boxed/dict"},next:{title:"Serializer",permalink:"/boxed/serializer"}},c={},p=[{value:"Lazy(f)",id:"lazyf",level:2},{value:"lazy.get()",id:"lazyget",level:2}],u={toc:p},s="wrapper";function y(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"lazyf"},"Lazy(f)"),(0,a.kt)("p",null,"Creates a lazy value. The computation won't happen until the first access."),(0,a.kt)("p",null,"A ",(0,a.kt)("inlineCode",{parentName:"p"},"lazy")," type exposes a ",(0,a.kt)("inlineCode",{parentName:"p"},"get")," method that'll return the result from the computation."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'import { Lazy } from "@swan-io/boxed";\n\nconst lazy = Lazy(() => {\n return myComputation();\n});\n')),(0,a.kt)("h2",{id:"lazyget"},"lazy.get()"),(0,a.kt)("p",null,"Computes the value ",(0,a.kt)("strong",{parentName:"p"},"once")," and returns it."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"lazy.get(); // value is computed and return here\n")))}y.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[571],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},s="mdxType",y={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),s=p(r),m=a,d=s["".concat(c,".").concat(m)]||s[m]||y[m]||o;return r?n.createElement(d,l(l({ref:t},u),{},{components:r})):n.createElement(d,l({ref:t},u))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[s]="string"==typeof e?e:a,l[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>y,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={title:"Lazy",sidebar_label:"Lazy"},l=void 0,i={unversionedId:"lazy",id:"lazy",title:"Lazy",description:"Lazy(f)",source:"@site/docs/lazy.md",sourceDirName:".",slug:"/lazy",permalink:"/lazy",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/lazy.md",tags:[],version:"current",frontMatter:{title:"Lazy",sidebar_label:"Lazy"},sidebar:"docs",previous:{title:"Dict",permalink:"/dict"},next:{title:"Serializer",permalink:"/serializer"}},c={},p=[{value:"Lazy(f)",id:"lazyf",level:2},{value:"lazy.get()",id:"lazyget",level:2}],u={toc:p},s="wrapper";function y(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"lazyf"},"Lazy(f)"),(0,a.kt)("p",null,"Creates a lazy value. The computation won't happen until the first access."),(0,a.kt)("p",null,"A ",(0,a.kt)("inlineCode",{parentName:"p"},"lazy")," type exposes a ",(0,a.kt)("inlineCode",{parentName:"p"},"get")," method that'll return the result from the computation."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'import { Lazy } from "@swan-io/boxed";\n\nconst lazy = Lazy(() => {\n return myComputation();\n});\n')),(0,a.kt)("h2",{id:"lazyget"},"lazy.get()"),(0,a.kt)("p",null,"Computes the value ",(0,a.kt)("strong",{parentName:"p"},"once")," and returns it."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"lazy.get(); // value is computed and return here\n")))}y.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/927d9381.002f0dfa.js b/assets/js/927d9381.002f0dfa.js deleted file mode 100644 index 3a842a70..00000000 --- a/assets/js/927d9381.002f0dfa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[620],{3905:(e,r,a)=>{a.d(r,{Zo:()=>y,kt:()=>m});var t=a(7294);function n(e,r,a){return r in e?Object.defineProperty(e,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[r]=a,e}function i(e,r){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),a.push.apply(a,t)}return a}function l(e){for(var r=1;r=0||(n[a]=e[a]);return n}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=t.createContext({}),s=function(e){var r=t.useContext(p),a=r;return e&&(a="function"==typeof e?e(r):l(l({},r),e)),a},y=function(e){var r=s(e.components);return t.createElement(p.Provider,{value:r},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var r=e.children;return t.createElement(t.Fragment,{},r)}},u=t.forwardRef((function(e,r){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,y=o(e,["components","mdxType","originalType","parentName"]),c=s(a),u=n,m=c["".concat(p,".").concat(u)]||c[u]||d[u]||i;return a?t.createElement(m,l(l({ref:r},y),{},{components:a})):t.createElement(m,l({ref:r},y))}));function m(e,r){var a=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var i=a.length,l=new Array(i);l[0]=u;var o={};for(var p in r)hasOwnProperty.call(r,p)&&(o[p]=r[p]);o.originalType=e,o[c]="string"==typeof e?e:n,l[1]=o;for(var s=2;s{a.r(r),a.d(r,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var t=a(7462),n=(a(7294),a(3905));const i={title:"Array",sidebar_label:"Array"},l=void 0,o={unversionedId:"array",id:"array",title:"Array",description:"Array.filterMap(array, func)",source:"@site/docs/array.md",sourceDirName:".",slug:"/array",permalink:"/boxed/array",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/array.md",tags:[],version:"current",frontMatter:{title:"Array",sidebar_label:"Array"},sidebar:"docs",previous:{title:"Deferred",permalink:"/boxed/deferred"},next:{title:"Dict",permalink:"/boxed/dict"}},p={},s=[{value:"Array.filterMap(array, func)",id:"arrayfiltermaparray-func",level:2},{value:"Array.findMap(array, func)",id:"arrayfindmaparray-func",level:2},{value:"Array.find(array, predicate)",id:"arrayfindarray-predicate",level:2},{value:"Array.findIndex(array, predicate)",id:"arrayfindindexarray-predicate",level:2},{value:"Array.binarySearchBy(sortedArray, item, compare)",id:"arraybinarysearchbysortedarray-item-compare",level:2},{value:"Array.zip(arrayA, arrayB)",id:"arrayziparraya-arrayb",level:2},{value:"Array.unzip(arrayOfPairs)",id:"arrayunziparrayofpairs",level:2},{value:"Array.from(arrayLike)",id:"arrayfromarraylike",level:2},{value:"Array.of(...items)",id:"arrayofitems",level:2},{value:"Array.isArray(value)",id:"arrayisarrayvalue",level:2}],y={toc:s},c="wrapper";function d(e){let{components:r,...a}=e;return(0,n.kt)(c,(0,t.Z)({},y,a,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},'import { Array } from "@swan-io/boxed";\n')),(0,n.kt)("h2",{id:"arrayfiltermaparray-func"},"Array.filterMap(array, func)"),(0,n.kt)("p",null,"Returns an array containing the ",(0,n.kt)("inlineCode",{parentName:"p"},"Option.Some")," values returned by ",(0,n.kt)("inlineCode",{parentName:"p"},"func")," for each array item."),(0,n.kt)("p",null,"This function can be useful to refine the types of an array."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Array.filterMap([1, 2, 3], (x) =>\n isEven(x) ? Option.Some(x) : Option.None(),\n); // [2]\n")),(0,n.kt)("h2",{id:"arrayfindmaparray-func"},"Array.findMap(array, func)"),(0,n.kt)("p",null,"Returns the first ",(0,n.kt)("inlineCode",{parentName:"p"},"Option.Some")," value returned by ",(0,n.kt)("inlineCode",{parentName:"p"},"func")," for each array item."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Array.findMap([1, 2, 3], (x) =>\n isEven(x) ? Option.Some(x) : Option.None(),\n); // Option.Some(2)\n")),(0,n.kt)("h2",{id:"arrayfindarray-predicate"},"Array.find(array, predicate)"),(0,n.kt)("p",null,"Return the first item in the array for which ",(0,n.kt)("inlineCode",{parentName:"p"},"predicate")," returns true."),(0,n.kt)("p",null,"The function returns an ",(0,n.kt)("inlineCode",{parentName:"p"},"Option")," so that we can distinguish between a found nullish value and a not found value."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Array.find(array, (x) => x === undefined);\n// Some(undefined) if found\n// None if not found\n")),(0,n.kt)("h2",{id:"arrayfindindexarray-predicate"},"Array.findIndex(array, predicate)"),(0,n.kt)("p",null,"Return the first index in the array for which ",(0,n.kt)("inlineCode",{parentName:"p"},"predicate")," returns true."),(0,n.kt)("p",null,"The function returns an ",(0,n.kt)("inlineCode",{parentName:"p"},"Option"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Array.findIndex(array, (x) => x === undefined);\n// Some(index) if found\n// None if not found\n")),(0,n.kt)("h2",{id:"arraybinarysearchbysortedarray-item-compare"},"Array.binarySearchBy(sortedArray, item, compare)"),(0,n.kt)("p",null,"Performs a binary search on the array."),(0,n.kt)("p",null,"Returns the index of the item if there's an exact match, return the index of the first superior value if not. Return ",(0,n.kt)("inlineCode",{parentName:"p"},"-1")," if the array is empty."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const index = Array.binarySearchBy(array, "my value");\n')),(0,n.kt)("h2",{id:"arrayziparraya-arrayb"},"Array.zip(arrayA, arrayB)"),(0,n.kt)("p",null,"Create an array of pairs from two arrays."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Array.zip([1, 2, 3], ["one", "two", "three"]);\n// [[1, "one"], [2, "two"], [3, "three"]]\n')),(0,n.kt)("h2",{id:"arrayunziparrayofpairs"},"Array.unzip(arrayOfPairs)"),(0,n.kt)("p",null,"Turns an array of pairs into two arrays."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Array.unzip([\n [1, "one"],\n [2, "two"],\n [3, "three"],\n]);\n// [[1, 2, 3], ["one", "two", "three"]]\n')),(0,n.kt)("h2",{id:"arrayfromarraylike"},"Array.from(arrayLike)"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Array/from"},"Array.from"),", reexported for convenience when Boxed ",(0,n.kt)("inlineCode",{parentName:"p"},"Array")," shadows the ",(0,n.kt)("inlineCode",{parentName:"p"},"Array")," constructor in scope."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Array.from({ length: 3 }, (_, key) => key); // [0, 1, 2]\n")),(0,n.kt)("h2",{id:"arrayofitems"},"Array.of(...items)"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of"},"Array.of"),", reexported for convenience when Boxed ",(0,n.kt)("inlineCode",{parentName:"p"},"Array")," shadows the ",(0,n.kt)("inlineCode",{parentName:"p"},"Array")," constructor in scope."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Array.of(1, 2, 3); // [1, 2, 3]\n")),(0,n.kt)("h2",{id:"arrayisarrayvalue"},"Array.isArray(value)"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray"},"Array.isArray"),", reexported for convenience when Boxed ",(0,n.kt)("inlineCode",{parentName:"p"},"Array")," shadows the ",(0,n.kt)("inlineCode",{parentName:"p"},"Array")," constructor in scope."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Array.isArray("");\n// false\n\nArray.isArray([1, 2, 3]);\n// true\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/927d9381.1fb3954c.js b/assets/js/927d9381.1fb3954c.js new file mode 100644 index 00000000..dd4af8ca --- /dev/null +++ b/assets/js/927d9381.1fb3954c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[620],{3905:(e,r,a)=>{a.d(r,{Zo:()=>y,kt:()=>m});var t=a(7294);function n(e,r,a){return r in e?Object.defineProperty(e,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[r]=a,e}function i(e,r){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),a.push.apply(a,t)}return a}function l(e){for(var r=1;r=0||(n[a]=e[a]);return n}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=t.createContext({}),s=function(e){var r=t.useContext(p),a=r;return e&&(a="function"==typeof e?e(r):l(l({},r),e)),a},y=function(e){var r=s(e.components);return t.createElement(p.Provider,{value:r},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var r=e.children;return t.createElement(t.Fragment,{},r)}},d=t.forwardRef((function(e,r){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,y=o(e,["components","mdxType","originalType","parentName"]),c=s(a),d=n,m=c["".concat(p,".").concat(d)]||c[d]||u[d]||i;return a?t.createElement(m,l(l({ref:r},y),{},{components:a})):t.createElement(m,l({ref:r},y))}));function m(e,r){var a=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var i=a.length,l=new Array(i);l[0]=d;var o={};for(var p in r)hasOwnProperty.call(r,p)&&(o[p]=r[p]);o.originalType=e,o[c]="string"==typeof e?e:n,l[1]=o;for(var s=2;s{a.r(r),a.d(r,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var t=a(7462),n=(a(7294),a(3905));const i={title:"Array",sidebar_label:"Array"},l=void 0,o={unversionedId:"array",id:"array",title:"Array",description:"Array.filterMap(array, func)",source:"@site/docs/array.md",sourceDirName:".",slug:"/array",permalink:"/array",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/array.md",tags:[],version:"current",frontMatter:{title:"Array",sidebar_label:"Array"},sidebar:"docs",previous:{title:"Deferred",permalink:"/deferred"},next:{title:"Dict",permalink:"/dict"}},p={},s=[{value:"Array.filterMap(array, func)",id:"arrayfiltermaparray-func",level:2},{value:"Array.findMap(array, func)",id:"arrayfindmaparray-func",level:2},{value:"Array.find(array, predicate)",id:"arrayfindarray-predicate",level:2},{value:"Array.findIndex(array, predicate)",id:"arrayfindindexarray-predicate",level:2},{value:"Array.binarySearchBy(sortedArray, item, compare)",id:"arraybinarysearchbysortedarray-item-compare",level:2},{value:"Array.zip(arrayA, arrayB)",id:"arrayziparraya-arrayb",level:2},{value:"Array.unzip(arrayOfPairs)",id:"arrayunziparrayofpairs",level:2},{value:"Array.from(arrayLike)",id:"arrayfromarraylike",level:2},{value:"Array.of(...items)",id:"arrayofitems",level:2},{value:"Array.isArray(value)",id:"arrayisarrayvalue",level:2}],y={toc:s},c="wrapper";function u(e){let{components:r,...a}=e;return(0,n.kt)(c,(0,t.Z)({},y,a,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},'import { Array } from "@swan-io/boxed";\n')),(0,n.kt)("h2",{id:"arrayfiltermaparray-func"},"Array.filterMap(array, func)"),(0,n.kt)("p",null,"Returns an array containing the ",(0,n.kt)("inlineCode",{parentName:"p"},"Option.Some")," values returned by ",(0,n.kt)("inlineCode",{parentName:"p"},"func")," for each array item."),(0,n.kt)("p",null,"This function can be useful to refine the types of an array."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Array.filterMap([1, 2, 3], (x) =>\n isEven(x) ? Option.Some(x) : Option.None(),\n); // [2]\n")),(0,n.kt)("h2",{id:"arrayfindmaparray-func"},"Array.findMap(array, func)"),(0,n.kt)("p",null,"Returns the first ",(0,n.kt)("inlineCode",{parentName:"p"},"Option.Some")," value returned by ",(0,n.kt)("inlineCode",{parentName:"p"},"func")," for each array item."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Array.findMap([1, 2, 3], (x) =>\n isEven(x) ? Option.Some(x) : Option.None(),\n); // Option.Some(2)\n")),(0,n.kt)("h2",{id:"arrayfindarray-predicate"},"Array.find(array, predicate)"),(0,n.kt)("p",null,"Return the first item in the array for which ",(0,n.kt)("inlineCode",{parentName:"p"},"predicate")," returns true."),(0,n.kt)("p",null,"The function returns an ",(0,n.kt)("inlineCode",{parentName:"p"},"Option")," so that we can distinguish between a found nullish value and a not found value."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Array.find(array, (x) => x === undefined);\n// Some(undefined) if found\n// None if not found\n")),(0,n.kt)("h2",{id:"arrayfindindexarray-predicate"},"Array.findIndex(array, predicate)"),(0,n.kt)("p",null,"Return the first index in the array for which ",(0,n.kt)("inlineCode",{parentName:"p"},"predicate")," returns true."),(0,n.kt)("p",null,"The function returns an ",(0,n.kt)("inlineCode",{parentName:"p"},"Option"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Array.findIndex(array, (x) => x === undefined);\n// Some(index) if found\n// None if not found\n")),(0,n.kt)("h2",{id:"arraybinarysearchbysortedarray-item-compare"},"Array.binarySearchBy(sortedArray, item, compare)"),(0,n.kt)("p",null,"Performs a binary search on the array."),(0,n.kt)("p",null,"Returns the index of the item if there's an exact match, return the index of the first superior value if not. Return ",(0,n.kt)("inlineCode",{parentName:"p"},"-1")," if the array is empty."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const index = Array.binarySearchBy(array, "my value");\n')),(0,n.kt)("h2",{id:"arrayziparraya-arrayb"},"Array.zip(arrayA, arrayB)"),(0,n.kt)("p",null,"Create an array of pairs from two arrays."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Array.zip([1, 2, 3], ["one", "two", "three"]);\n// [[1, "one"], [2, "two"], [3, "three"]]\n')),(0,n.kt)("h2",{id:"arrayunziparrayofpairs"},"Array.unzip(arrayOfPairs)"),(0,n.kt)("p",null,"Turns an array of pairs into two arrays."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Array.unzip([\n [1, "one"],\n [2, "two"],\n [3, "three"],\n]);\n// [[1, 2, 3], ["one", "two", "three"]]\n')),(0,n.kt)("h2",{id:"arrayfromarraylike"},"Array.from(arrayLike)"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Array/from"},"Array.from"),", reexported for convenience when Boxed ",(0,n.kt)("inlineCode",{parentName:"p"},"Array")," shadows the ",(0,n.kt)("inlineCode",{parentName:"p"},"Array")," constructor in scope."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Array.from({ length: 3 }, (_, key) => key); // [0, 1, 2]\n")),(0,n.kt)("h2",{id:"arrayofitems"},"Array.of(...items)"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of"},"Array.of"),", reexported for convenience when Boxed ",(0,n.kt)("inlineCode",{parentName:"p"},"Array")," shadows the ",(0,n.kt)("inlineCode",{parentName:"p"},"Array")," constructor in scope."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Array.of(1, 2, 3); // [1, 2, 3]\n")),(0,n.kt)("h2",{id:"arrayisarrayvalue"},"Array.isArray(value)"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray"},"Array.isArray"),", reexported for convenience when Boxed ",(0,n.kt)("inlineCode",{parentName:"p"},"Array")," shadows the ",(0,n.kt)("inlineCode",{parentName:"p"},"Array")," constructor in scope."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Array.isArray("");\n// false\n\nArray.isArray([1, 2, 3]);\n// true\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.01248db0.js b/assets/js/935f2afb.01248db0.js new file mode 100644 index 00000000..506b0a70 --- /dev/null +++ b/assets/js/935f2afb.01248db0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"category","label":"Learn","collapsed":false,"items":[{"type":"link","label":"Getting started","href":"/getting-started","docId":"getting-started"},{"type":"link","label":"Core Concepts","href":"/core-concepts","docId":"core-concepts"},{"type":"link","label":"Installation","href":"/installation","docId":"installation"},{"type":"link","label":"Design choices","href":"/design-choices","docId":"design-choices"}],"collapsible":true},{"type":"category","label":"API","collapsed":false,"items":[{"type":"link","label":"Option","href":"/option","docId":"option"},{"type":"link","label":"Result","href":"/result","docId":"result"},{"type":"category","label":"Async Data","collapsed":false,"items":[{"type":"link","label":"AsyncData","href":"/async-data","docId":"async-data"},{"type":"link","label":"AsyncData helpers","href":"/async-data-result","docId":"async-data-result"}],"collapsible":true},{"type":"category","label":"Future","collapsed":false,"items":[{"type":"link","label":"Future","href":"/future","docId":"future"},{"type":"link","label":"Future helpers","href":"/future-result","docId":"future-result"}],"collapsible":true},{"type":"link","label":"Deferred","href":"/deferred","docId":"deferred"},{"type":"link","label":"Array","href":"/array","docId":"array"},{"type":"link","label":"Dict","href":"/dict","docId":"dict"},{"type":"link","label":"Lazy","href":"/lazy","docId":"lazy"},{"type":"link","label":"Serializer","href":"/serializer","docId":"serializer"}],"collapsible":true},{"type":"category","label":"Examples","collapsed":false,"items":[{"type":"link","label":"React Request","href":"/react-request","docId":"react-request"},{"type":"link","label":"Form Validation","href":"/form-validation","docId":"form-validation"},{"type":"link","label":"Nested optional values","href":"/nested-optional-values","docId":"nested-optional-values"},{"type":"link","label":"Cancellable Request","href":"/cancellable-request","docId":"cancellable-request"},{"type":"link","label":"Retry","href":"/retry","docId":"retry"},{"type":"link","label":"Concurrency","href":"/concurrency","docId":"concurrency"}],"collapsible":true},{"type":"link","label":"Inspirations","href":"/inspirations","docId":"inspirations"}]},"docs":{"array":{"id":"array","title":"Array","description":"Array.filterMap(array, func)","sidebar":"docs"},"async-data":{"id":"async-data","title":"AsyncData","description":"The AsyncData type enables representing asynchronous flows (e.g. requests). The type represents the state as a discriminating union, avoiding manual management for loading flows.","sidebar":"docs"},"async-data-result":{"id":"async-data-result","title":"AsyncData>","description":"A AsyncData can contain a Result (e.g. to represent an asynchronous value that can fail). We provide some utility functions to deal with that case without having to unwrap the AsyncData result.","sidebar":"docs"},"cancellable-request":{"id":"cancellable-request","title":"Cancellable Request","description":"When using the naive fetch, cancelling a request can be inelegant:","sidebar":"docs"},"concurrency":{"id":"concurrency","title":"Concurrency","description":"While you have a simple Future.all to run all futures in parallel (like Promise.all does), you might want to limit the concurrency at which you execute operations.","sidebar":"docs"},"core-concepts":{"id":"core-concepts","title":"Core Concepts","description":"The Boxed approach takes root in typed functional paradigms. We know that these concepts can be overwhelming, especially with their jargon and mathematical concepts, and therefore want to make them more accessible.","sidebar":"docs"},"deferred":{"id":"deferred","title":"Deferred","description":"Deferred.make()","sidebar":"docs"},"design-choices":{"id":"design-choices","title":"Design choices","description":"Chaining API","sidebar":"docs"},"dict":{"id":"dict","title":"Dict","description":"Dict.entries(dict)","sidebar":"docs"},"form-validation":{"id":"form-validation","title":"Form Validation","description":"A common need in applications is to validate user-input before sending it to the server.","sidebar":"docs"},"future":{"id":"future","title":"Future","description":"The Future is a replacement for Promise.","sidebar":"docs"},"future-result":{"id":"future-result","title":"Future>","description":"A Future can contain a Result (e.g. to represent an asynchronous value that can fail). We provide some utility functions to deal with that case without having to unwrap the Future result.","sidebar":"docs"},"getting-started":{"id":"getting-started","title":"Getting started","description":"Boxed provides essential building-blocks to solve common issues you can run into in your application or library development.","sidebar":"docs"},"inspirations":{"id":"inspirations","title":"Inspirations","description":"- ReScript\'s Belt Stdlib","sidebar":"docs"},"installation":{"id":"installation","title":"Installation","description":"Prerequisites","sidebar":"docs"},"lazy":{"id":"lazy","title":"Lazy","description":"Lazy(f)","sidebar":"docs"},"nested-optional-values":{"id":"nested-optional-values","title":"Nested optional values","description":"Managing optionality with undefined and null can lead to tedious code, especially when dealing with default values.","sidebar":"docs"},"option":{"id":"option","title":"Option","description":"The Option type can be used as a replacement for null and undefined when manipulating optional data. Contrary to null and undefined, an option is kind of like a box, that contains a value or not.","sidebar":"docs"},"react-request":{"id":"react-request","title":"React Request","description":"The AsyncData type removes the need for manual request modeling.","sidebar":"docs"},"result":{"id":"result","title":"Result","description":"The Result can replace exception flows.","sidebar":"docs"},"retry":{"id":"retry","title":"Retry","description":"When some operations can fail, you might want to implement a retry logic.","sidebar":"docs"},"serializer":{"id":"serializer","title":"Serializer","description":"The serializer enables you to serialize some Boxed values (e.g. to store in LocalStorage, or to hydrate data from SSR).","sidebar":"docs"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.5329af00.js b/assets/js/935f2afb.5329af00.js deleted file mode 100644 index fbc0154b..00000000 --- a/assets/js/935f2afb.5329af00.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"category","label":"Learn","collapsed":false,"items":[{"type":"link","label":"Getting started","href":"/boxed/getting-started","docId":"getting-started"},{"type":"link","label":"Core Concepts","href":"/boxed/core-concepts","docId":"core-concepts"},{"type":"link","label":"Installation","href":"/boxed/installation","docId":"installation"},{"type":"link","label":"Design choices","href":"/boxed/design-choices","docId":"design-choices"}],"collapsible":true},{"type":"category","label":"API","collapsed":false,"items":[{"type":"link","label":"Option","href":"/boxed/option","docId":"option"},{"type":"link","label":"Result","href":"/boxed/result","docId":"result"},{"type":"category","label":"Async Data","collapsed":false,"items":[{"type":"link","label":"AsyncData","href":"/boxed/async-data","docId":"async-data"},{"type":"link","label":"AsyncData helpers","href":"/boxed/async-data-result","docId":"async-data-result"}],"collapsible":true},{"type":"category","label":"Future","collapsed":false,"items":[{"type":"link","label":"Future","href":"/boxed/future","docId":"future"},{"type":"link","label":"Future helpers","href":"/boxed/future-result","docId":"future-result"}],"collapsible":true},{"type":"link","label":"Deferred","href":"/boxed/deferred","docId":"deferred"},{"type":"link","label":"Array","href":"/boxed/array","docId":"array"},{"type":"link","label":"Dict","href":"/boxed/dict","docId":"dict"},{"type":"link","label":"Lazy","href":"/boxed/lazy","docId":"lazy"},{"type":"link","label":"Serializer","href":"/boxed/serializer","docId":"serializer"}],"collapsible":true},{"type":"category","label":"Examples","collapsed":false,"items":[{"type":"link","label":"React Request","href":"/boxed/react-request","docId":"react-request"},{"type":"link","label":"Form Validation","href":"/boxed/form-validation","docId":"form-validation"},{"type":"link","label":"Nested optional values","href":"/boxed/nested-optional-values","docId":"nested-optional-values"},{"type":"link","label":"Cancellable Request","href":"/boxed/cancellable-request","docId":"cancellable-request"},{"type":"link","label":"Retry","href":"/boxed/retry","docId":"retry"},{"type":"link","label":"Concurrency","href":"/boxed/concurrency","docId":"concurrency"}],"collapsible":true},{"type":"link","label":"Inspirations","href":"/boxed/inspirations","docId":"inspirations"}]},"docs":{"array":{"id":"array","title":"Array","description":"Array.filterMap(array, func)","sidebar":"docs"},"async-data":{"id":"async-data","title":"AsyncData","description":"The AsyncData type enables representing asynchronous flows (e.g. requests). The type represents the state as a discriminating union, avoiding manual management for loading flows.","sidebar":"docs"},"async-data-result":{"id":"async-data-result","title":"AsyncData>","description":"A AsyncData can contain a Result (e.g. to represent an asynchronous value that can fail). We provide some utility functions to deal with that case without having to unwrap the AsyncData result.","sidebar":"docs"},"cancellable-request":{"id":"cancellable-request","title":"Cancellable Request","description":"When using the naive fetch, cancelling a request can be inelegant:","sidebar":"docs"},"concurrency":{"id":"concurrency","title":"Concurrency","description":"While you have a simple Future.all to run all futures in parallel (like Promise.all does), you might want to limit the concurrency at which you execute operations.","sidebar":"docs"},"core-concepts":{"id":"core-concepts","title":"Core Concepts","description":"The Boxed approach takes root in typed functional paradigms. We know that these concepts can be overwhelming, especially with their jargon and mathematical concepts, and therefore want to make them more accessible.","sidebar":"docs"},"deferred":{"id":"deferred","title":"Deferred","description":"Deferred.make()","sidebar":"docs"},"design-choices":{"id":"design-choices","title":"Design choices","description":"Chaining API","sidebar":"docs"},"dict":{"id":"dict","title":"Dict","description":"Dict.entries(dict)","sidebar":"docs"},"form-validation":{"id":"form-validation","title":"Form Validation","description":"A common need in applications is to validate user-input before sending it to the server.","sidebar":"docs"},"future":{"id":"future","title":"Future","description":"The Future is a replacement for Promise.","sidebar":"docs"},"future-result":{"id":"future-result","title":"Future>","description":"A Future can contain a Result (e.g. to represent an asynchronous value that can fail). We provide some utility functions to deal with that case without having to unwrap the Future result.","sidebar":"docs"},"getting-started":{"id":"getting-started","title":"Getting started","description":"Boxed provides essential building-blocks to solve common issues you can run into in your application or library development.","sidebar":"docs"},"inspirations":{"id":"inspirations","title":"Inspirations","description":"- ReScript\'s Belt Stdlib","sidebar":"docs"},"installation":{"id":"installation","title":"Installation","description":"Prerequisites","sidebar":"docs"},"lazy":{"id":"lazy","title":"Lazy","description":"Lazy(f)","sidebar":"docs"},"nested-optional-values":{"id":"nested-optional-values","title":"Nested optional values","description":"Managing optionality with undefined and null can lead to tedious code, especially when dealing with default values.","sidebar":"docs"},"option":{"id":"option","title":"Option","description":"The Option type can be used as a replacement for null and undefined when manipulating optional data. Contrary to null and undefined, an option is kind of like a box, that contains a value or not.","sidebar":"docs"},"react-request":{"id":"react-request","title":"React Request","description":"The AsyncData type removes the need for manual request modeling.","sidebar":"docs"},"result":{"id":"result","title":"Result","description":"The Result can replace exception flows.","sidebar":"docs"},"retry":{"id":"retry","title":"Retry","description":"When some operations can fail, you might want to implement a retry logic.","sidebar":"docs"},"serializer":{"id":"serializer","title":"Serializer","description":"The serializer enables you to serialize some Boxed values (e.g. to store in LocalStorage, or to hydrate data from SSR).","sidebar":"docs"}}}')}}]); \ No newline at end of file diff --git a/assets/js/974039d5.8523e08b.js b/assets/js/974039d5.8523e08b.js deleted file mode 100644 index 0db6419a..00000000 --- a/assets/js/974039d5.8523e08b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[385],{3905:(e,a,t)=>{t.d(a,{Zo:()=>d,kt:()=>k});var n=t(7294);function l(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var a=1;a=0||(l[t]=e[t]);return l}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):s(s({},a),e)),t},d=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=p(t),u=l,k=c["".concat(o,".").concat(u)]||c[u]||m[u]||r;return t?n.createElement(k,s(s({ref:a},d),{},{components:t})):n.createElement(k,s({ref:a},d))}));function k(e,a){var t=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var r=t.length,s=new Array(r);s[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[c]="string"==typeof e?e:l,s[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>s,default:()=>m,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var n=t(7462),l=(t(7294),t(3905));const r={title:"AsyncData",sidebar_label:"AsyncData"},s=void 0,i={unversionedId:"async-data",id:"async-data",title:"AsyncData",description:"The AsyncData type enables representing asynchronous flows (e.g. requests). The type represents the state as a discriminating union, avoiding manual management for loading flows.",source:"@site/docs/async-data.md",sourceDirName:".",slug:"/async-data",permalink:"/boxed/async-data",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/async-data.md",tags:[],version:"current",frontMatter:{title:"AsyncData",sidebar_label:"AsyncData"},sidebar:"docs",previous:{title:"Result",permalink:"/boxed/result"},next:{title:"AsyncData helpers",permalink:"/boxed/async-data-result"}},o={},p=[{value:"Create an AsyncData value",id:"create-an-asyncdata-value",level:2},{value:"Methods",id:"methods",level:2},{value:".map(f)",id:"mapf",level:3},{value:".flatMap(f)",id:"flatmapf",level:3},{value:".getOr(defaultValue)",id:"getordefaultvalue",level:3},{value:".mapOr(defaultValue, mapper)",id:"mapordefaultvalue-mapper",level:3},{value:".get()",id:"get",level:3},{value:".isDone()",id:"isdone",level:3},{value:".isLoading()",id:"isloading",level:3},{value:".isNotAsked()",id:"isnotasked",level:3},{value:".toOption()",id:"tooption",level:3},{value:".match()",id:"match",level:3},{value:".tap(func)",id:"tapfunc",level:3},{value:"Statics",id:"statics",level:2},{value:"AsyncData.isAsyncData(value)",id:"asyncdataisasyncdatavalue",level:3},{value:"AsyncData.all(asyncDatas)",id:"asyncdataallasyncdatas",level:3},{value:"AsyncData.allFromDict(asyncDatas)",id:"asyncdataallfromdictasyncdatas",level:3},{value:"TS Pattern interop",id:"ts-pattern-interop",level:2},{value:"Cheatsheet",id:"cheatsheet",level:2}],d={toc:p},c="wrapper";function m(e){let{components:a,...t}=e;return(0,l.kt)(c,(0,n.Z)({},d,t,{components:a,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"The ",(0,l.kt)("inlineCode",{parentName:"p"},"AsyncData")," type enables representing asynchronous flows (e.g. requests). The type represents the state as a discriminating union, avoiding manual management for loading flows."),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"AsyncData")," can have three possible states:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"NotAsked")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Loading")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Done(value)"))),(0,l.kt)("h2",{id:"create-an-asyncdata-value"},"Create an AsyncData value"),(0,l.kt)("p",null,"To create an async data, use the ",(0,l.kt)("inlineCode",{parentName:"p"},"NotAsked"),", ",(0,l.kt)("inlineCode",{parentName:"p"},"Loading")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"Done")," constructors:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'import { AsyncData } from "@swan-io/boxed";\n\nconst notAsked = AsyncData.NotAsked();\n\nconst loading = AsyncData.Loading();\n\nconst done = AsyncData.Done(1);\n')),(0,l.kt)("admonition",{title:"Since v3.0.0",type:"tip"},(0,l.kt)("p",{parentName:"admonition"},(0,l.kt)("inlineCode",{parentName:"p"},"AsyncData")," values are referentially equal if they contain the same value, meaning that ",(0,l.kt)("inlineCode",{parentName:"p"},"AsyncData.Done(1) === AsyncData.Done(1)"),".")),(0,l.kt)("h2",{id:"methods"},"Methods"),(0,l.kt)("p",null,"The async data type provides a few manipulation functions:"),(0,l.kt)("h3",{id:"mapf"},".map(f)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.map(f: (value: A) => B): AsyncData\n")),(0,l.kt)("p",null,"If the asyncData is ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(f(value))"),", otherwise returns the async data."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(2).map((x) => x * 2);\n// AsyncData.Done<4>\n\nAsyncData.Loading().map((x) => x * 2);\n// AsyncData.Loading\n\nAsyncData.NotAsked().map((x) => x * 2);\n// AsyncData.NotAsked\n")),(0,l.kt)("h3",{id:"flatmapf"},".flatMap(f)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.flatMap(f: (value: A) => AsyncData): AsyncData\n")),(0,l.kt)("p",null,"If the asyncData is ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"f(value)"),", otherwise returns the async data."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(3).flatMap((x) =>\n x > 2 ? AsyncData.NotAsked() : AsyncData.Done(2),\n);\n// AsyncData.NotAsked\n\nAsyncData.Done(1).flatMap((x) =>\n x > 2 ? AsyncData.NotAsked() : AsyncData.Done(2),\n);\n// AsyncData.Done<2>\n\nAsyncData.NotAsked().flatMap((x) =>\n x > 2 ? AsyncData.NotAsked() : AsyncData.Done(2),\n);\n// AsyncData.NotAsked\n\nAsyncData.Loading().flatMap((x) =>\n x > 2 ? AsyncData.NotAsked() : AsyncData.Done(2),\n);\n// AsyncData.Loading\n")),(0,l.kt)("h3",{id:"getordefaultvalue"},".getOr(defaultValue)"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"Alias: ",(0,l.kt)("inlineCode",{parentName:"p"},"getWithDefault"))),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.getOr(defaultValue: A): A\n")),(0,l.kt)("p",null,"If the async data is ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"value"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"defaultValue"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(2).getOr(1);\n// 2\n\nAsyncData.Loading().getOr(1);\n// 1\n\nAsyncData.NotAsked().getOr(1);\n// 1\n")),(0,l.kt)("h3",{id:"mapordefaultvalue-mapper"},".mapOr(defaultValue, mapper)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.mapOr(defaultValue: B, mapper: (a: A) => B): B\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"mapper(value)"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"defaultValue"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(2).mapOr(1, (x) => x * 2);\n// 4\n\nAsyncData.NotAsked().mapOr(1, (x) => x * 2);\n// 1\n\nAsyncData.Loading().mapOr(1, (x) => x * 2);\n// 1\n")),(0,l.kt)("h3",{id:"get"},".get()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.get(): A\n")),(0,l.kt)("p",null,"Returns the value contained in ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)"),". Only usable within a ",(0,l.kt)("inlineCode",{parentName:"p"},"isDone()")," check."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const value = asyncData.get();\n// does not compile\n\nif (asyncData.isDone()) {\n const value = asyncData.get();\n // value\n}\n")),(0,l.kt)("h3",{id:"isdone"},".isDone()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.isDone(): boolean\n")),(0,l.kt)("p",null,"Type guard. Checks if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(2).isDone();\n// true\n\nAsyncData.Loading().isDone();\n// false\n\nAsyncData.NotAsked().isDone();\n// false\n\nif (asyncData.isDone()) {\n const value = asyncData.get();\n}\n")),(0,l.kt)("h3",{id:"isloading"},".isLoading()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.isLoading(): boolean\n")),(0,l.kt)("p",null,"Type guard. Checks if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Loading")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(2).isLoading();\n// false\n\nAsyncData.Loading().isLoading();\n// true\n\nAsyncData.NotAsked().isLoading();\n// false\n")),(0,l.kt)("h3",{id:"isnotasked"},".isNotAsked()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.isNotAsked(): boolean\n")),(0,l.kt)("p",null,"Type guard. Checks if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"NotAsked")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(2).isNotAsked();\n// false\n\nAsyncData.Loading().isNotAsked();\n// false\n\nAsyncData.NotAsked().isNotAsked();\n// true\n")),(0,l.kt)("h3",{id:"tooption"},".toOption()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.toOption(): Option\n")),(0,l.kt)("p",null,"If the result is ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"None"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Done(2).toOption();\n// Option.Some<2>\n\nResult.Loading().toOption();\n// Option.None\n\nResult.NotAsked().toOption();\n// Option.None\n")),(0,l.kt)("h3",{id:"match"},".match()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.match(config: {\n Done: (value: A) => B;\n Loading: () => B;\n NotAsked: () => B;\n}): B;\n")),(0,l.kt)("p",null,"Match the async data state"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const valueToDisplay = result.match({\n Done: (value) => value,\n Loading: () => "Loading ...",\n NotAsked: () => "",\n});\n')),(0,l.kt)("h3",{id:"tapfunc"},".tap(func)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.tap(func: (asyncData: AsyncData) => unknown): AsyncData\n")),(0,l.kt)("p",null,"Executes ",(0,l.kt)("inlineCode",{parentName:"p"},"func")," with ",(0,l.kt)("inlineCode",{parentName:"p"},"asyncData"),", and returns ",(0,l.kt)("inlineCode",{parentName:"p"},"asyncData"),". Useful for logging and debugging."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"asyncData.tap(console.log).map((x) => x * 2);\n")),(0,l.kt)("h2",{id:"statics"},"Statics"),(0,l.kt)("h3",{id:"asyncdataisasyncdatavalue"},"AsyncData.isAsyncData(value)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"isAsyncData(value: unknown): boolean\n")),(0,l.kt)("p",null,"Type guard, checks if the provided value is an asyncData."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.isAsyncData(AsyncData.Done(1));\n// true\n\nAsyncData.isAsyncData([]);\n// false\n")),(0,l.kt)("h3",{id:"asyncdataallasyncdatas"},"AsyncData.all(asyncDatas)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"all(asyncDatas: Array>): AsyncData>\n")),(0,l.kt)("p",null,'Turns an "array of asyncDatas of value" into a "asyncData of array of value".'),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.all([AsyncData.Done(1), AsyncData.Done(2), AsyncData.Done(3)]);\n// AsyncData.Done<[1, 2, 3]>\n\nAsyncData.all([Result.NotAsked(), AsyncData.Done(2), AsyncData.Done(3)]);\n// AsyncData.NotAsked\n\nAsyncData.all([Result.Loading(), AsyncData.Done(2), AsyncData.Done(3)]);\n// AsyncData.Loading\n")),(0,l.kt)("h3",{id:"asyncdataallfromdictasyncdatas"},"AsyncData.allFromDict(asyncDatas)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"allFromDict(asyncDatas: Dict>): AsyncData>\n")),(0,l.kt)("p",null,'Turns a "dict of asyncDatas of value" into a "asyncData of dict of value".'),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.allFromDict({\n a: AsyncData.Done(1),\n b: AsyncData.Done(2),\n c: AsyncData.Done(3),\n});\n// AsyncData.Done<{a: 1, b: 2, c: 3}>\n\nAsyncData.allFromDict({\n a: Result.NotAsked(),\n b: AsyncData.Done(2),\n c: AsyncData.Done(3),\n});\n// AsyncData.NotAsked\n\nAsyncData.allFromDict({\n a: Result.Loading(),\n b: AsyncData.Done(2),\n c: AsyncData.Done(3),\n});\n// AsyncData.Loading\n")),(0,l.kt)("h2",{id:"ts-pattern-interop"},"TS Pattern interop"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'import { match, P } from "ts-pattern";\nimport { AsyncData } from "@swan-io/boxed";\n\nmatch(asyncData)\n .with(AsyncData.P.Done(P.select()), (value) => console.log(value))\n .with(AsyncData.P.Loading, () => "Loading ...")\n .with(AsyncData.P.NotAsked, () => "")\n .exhaustive();\n')),(0,l.kt)("h2",{id:"cheatsheet"},"Cheatsheet"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Method"),(0,l.kt)("th",{parentName:"tr",align:null},"Input"),(0,l.kt)("th",{parentName:"tr",align:null},"Function input"),(0,l.kt)("th",{parentName:"tr",align:null},"Function output"),(0,l.kt)("th",{parentName:"tr",align:null},"Returned value"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#mapf"},(0,l.kt)("inlineCode",{parentName:"a"},"map"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"y")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(y)"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#mapf"},(0,l.kt)("inlineCode",{parentName:"a"},"map"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Loading()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not provided")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not executed")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Loading()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#mapf"},(0,l.kt)("inlineCode",{parentName:"a"},"map"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"NotAsked()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not provided")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not executed")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"NotAsked()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(y)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(y)"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Loading()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Loading()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"NotAsked()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"NotAsked()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Loading()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not provided")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not executed")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Loading()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"NotAsked()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not provided")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not executed")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"NotAsked()"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/974039d5.d9289c41.js b/assets/js/974039d5.d9289c41.js new file mode 100644 index 00000000..56d585da --- /dev/null +++ b/assets/js/974039d5.d9289c41.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[385],{3905:(e,a,t)=>{t.d(a,{Zo:()=>d,kt:()=>k});var n=t(7294);function l(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var a=1;a=0||(l[t]=e[t]);return l}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var o=n.createContext({}),p=function(e){var a=n.useContext(o),t=a;return e&&(t="function"==typeof e?e(a):s(s({},a),e)),t},d=function(e){var a=p(e.components);return n.createElement(o.Provider,{value:a},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},u=n.forwardRef((function(e,a){var t=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=p(t),u=l,k=c["".concat(o,".").concat(u)]||c[u]||m[u]||r;return t?n.createElement(k,s(s({ref:a},d),{},{components:t})):n.createElement(k,s({ref:a},d))}));function k(e,a){var t=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var r=t.length,s=new Array(r);s[0]=u;var i={};for(var o in a)hasOwnProperty.call(a,o)&&(i[o]=a[o]);i.originalType=e,i[c]="string"==typeof e?e:l,s[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>o,contentTitle:()=>s,default:()=>m,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var n=t(7462),l=(t(7294),t(3905));const r={title:"AsyncData",sidebar_label:"AsyncData"},s=void 0,i={unversionedId:"async-data",id:"async-data",title:"AsyncData",description:"The AsyncData type enables representing asynchronous flows (e.g. requests). The type represents the state as a discriminating union, avoiding manual management for loading flows.",source:"@site/docs/async-data.md",sourceDirName:".",slug:"/async-data",permalink:"/async-data",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/async-data.md",tags:[],version:"current",frontMatter:{title:"AsyncData",sidebar_label:"AsyncData"},sidebar:"docs",previous:{title:"Result",permalink:"/result"},next:{title:"AsyncData helpers",permalink:"/async-data-result"}},o={},p=[{value:"Create an AsyncData value",id:"create-an-asyncdata-value",level:2},{value:"Methods",id:"methods",level:2},{value:".map(f)",id:"mapf",level:3},{value:".flatMap(f)",id:"flatmapf",level:3},{value:".getOr(defaultValue)",id:"getordefaultvalue",level:3},{value:".mapOr(defaultValue, mapper)",id:"mapordefaultvalue-mapper",level:3},{value:".get()",id:"get",level:3},{value:".isDone()",id:"isdone",level:3},{value:".isLoading()",id:"isloading",level:3},{value:".isNotAsked()",id:"isnotasked",level:3},{value:".toOption()",id:"tooption",level:3},{value:".match()",id:"match",level:3},{value:".tap(func)",id:"tapfunc",level:3},{value:"Statics",id:"statics",level:2},{value:"AsyncData.isAsyncData(value)",id:"asyncdataisasyncdatavalue",level:3},{value:"AsyncData.all(asyncDatas)",id:"asyncdataallasyncdatas",level:3},{value:"AsyncData.allFromDict(asyncDatas)",id:"asyncdataallfromdictasyncdatas",level:3},{value:"TS Pattern interop",id:"ts-pattern-interop",level:2},{value:"Cheatsheet",id:"cheatsheet",level:2}],d={toc:p},c="wrapper";function m(e){let{components:a,...t}=e;return(0,l.kt)(c,(0,n.Z)({},d,t,{components:a,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"The ",(0,l.kt)("inlineCode",{parentName:"p"},"AsyncData")," type enables representing asynchronous flows (e.g. requests). The type represents the state as a discriminating union, avoiding manual management for loading flows."),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"AsyncData")," can have three possible states:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"NotAsked")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Loading")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Done(value)"))),(0,l.kt)("h2",{id:"create-an-asyncdata-value"},"Create an AsyncData value"),(0,l.kt)("p",null,"To create an async data, use the ",(0,l.kt)("inlineCode",{parentName:"p"},"NotAsked"),", ",(0,l.kt)("inlineCode",{parentName:"p"},"Loading")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"Done")," constructors:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'import { AsyncData } from "@swan-io/boxed";\n\nconst notAsked = AsyncData.NotAsked();\n\nconst loading = AsyncData.Loading();\n\nconst done = AsyncData.Done(1);\n')),(0,l.kt)("admonition",{title:"Since v3.0.0",type:"tip"},(0,l.kt)("p",{parentName:"admonition"},(0,l.kt)("inlineCode",{parentName:"p"},"AsyncData")," values are referentially equal if they contain the same value, meaning that ",(0,l.kt)("inlineCode",{parentName:"p"},"AsyncData.Done(1) === AsyncData.Done(1)"),".")),(0,l.kt)("h2",{id:"methods"},"Methods"),(0,l.kt)("p",null,"The async data type provides a few manipulation functions:"),(0,l.kt)("h3",{id:"mapf"},".map(f)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.map(f: (value: A) => B): AsyncData\n")),(0,l.kt)("p",null,"If the asyncData is ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(f(value))"),", otherwise returns the async data."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(2).map((x) => x * 2);\n// AsyncData.Done<4>\n\nAsyncData.Loading().map((x) => x * 2);\n// AsyncData.Loading\n\nAsyncData.NotAsked().map((x) => x * 2);\n// AsyncData.NotAsked\n")),(0,l.kt)("h3",{id:"flatmapf"},".flatMap(f)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.flatMap(f: (value: A) => AsyncData): AsyncData\n")),(0,l.kt)("p",null,"If the asyncData is ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"f(value)"),", otherwise returns the async data."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(3).flatMap((x) =>\n x > 2 ? AsyncData.NotAsked() : AsyncData.Done(2),\n);\n// AsyncData.NotAsked\n\nAsyncData.Done(1).flatMap((x) =>\n x > 2 ? AsyncData.NotAsked() : AsyncData.Done(2),\n);\n// AsyncData.Done<2>\n\nAsyncData.NotAsked().flatMap((x) =>\n x > 2 ? AsyncData.NotAsked() : AsyncData.Done(2),\n);\n// AsyncData.NotAsked\n\nAsyncData.Loading().flatMap((x) =>\n x > 2 ? AsyncData.NotAsked() : AsyncData.Done(2),\n);\n// AsyncData.Loading\n")),(0,l.kt)("h3",{id:"getordefaultvalue"},".getOr(defaultValue)"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"Alias: ",(0,l.kt)("inlineCode",{parentName:"p"},"getWithDefault"))),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.getOr(defaultValue: A): A\n")),(0,l.kt)("p",null,"If the async data is ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"value"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"defaultValue"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(2).getOr(1);\n// 2\n\nAsyncData.Loading().getOr(1);\n// 1\n\nAsyncData.NotAsked().getOr(1);\n// 1\n")),(0,l.kt)("h3",{id:"mapordefaultvalue-mapper"},".mapOr(defaultValue, mapper)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.mapOr(defaultValue: B, mapper: (a: A) => B): B\n")),(0,l.kt)("p",null,"If the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"mapper(value)"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"defaultValue"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(2).mapOr(1, (x) => x * 2);\n// 4\n\nAsyncData.NotAsked().mapOr(1, (x) => x * 2);\n// 1\n\nAsyncData.Loading().mapOr(1, (x) => x * 2);\n// 1\n")),(0,l.kt)("h3",{id:"get"},".get()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.get(): A\n")),(0,l.kt)("p",null,"Returns the value contained in ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)"),". Only usable within a ",(0,l.kt)("inlineCode",{parentName:"p"},"isDone()")," check."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const value = asyncData.get();\n// does not compile\n\nif (asyncData.isDone()) {\n const value = asyncData.get();\n // value\n}\n")),(0,l.kt)("h3",{id:"isdone"},".isDone()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.isDone(): boolean\n")),(0,l.kt)("p",null,"Type guard. Checks if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(2).isDone();\n// true\n\nAsyncData.Loading().isDone();\n// false\n\nAsyncData.NotAsked().isDone();\n// false\n\nif (asyncData.isDone()) {\n const value = asyncData.get();\n}\n")),(0,l.kt)("h3",{id:"isloading"},".isLoading()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.isLoading(): boolean\n")),(0,l.kt)("p",null,"Type guard. Checks if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"Loading")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(2).isLoading();\n// false\n\nAsyncData.Loading().isLoading();\n// true\n\nAsyncData.NotAsked().isLoading();\n// false\n")),(0,l.kt)("h3",{id:"isnotasked"},".isNotAsked()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.isNotAsked(): boolean\n")),(0,l.kt)("p",null,"Type guard. Checks if the option is ",(0,l.kt)("inlineCode",{parentName:"p"},"NotAsked")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.Done(2).isNotAsked();\n// false\n\nAsyncData.Loading().isNotAsked();\n// false\n\nAsyncData.NotAsked().isNotAsked();\n// true\n")),(0,l.kt)("h3",{id:"tooption"},".toOption()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.toOption(): Option\n")),(0,l.kt)("p",null,"If the result is ",(0,l.kt)("inlineCode",{parentName:"p"},"Done(value)")," returns ",(0,l.kt)("inlineCode",{parentName:"p"},"Some(value)"),", otherwise returns ",(0,l.kt)("inlineCode",{parentName:"p"},"None"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Done(2).toOption();\n// Option.Some<2>\n\nResult.Loading().toOption();\n// Option.None\n\nResult.NotAsked().toOption();\n// Option.None\n")),(0,l.kt)("h3",{id:"match"},".match()"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.match(config: {\n Done: (value: A) => B;\n Loading: () => B;\n NotAsked: () => B;\n}): B;\n")),(0,l.kt)("p",null,"Match the async data state"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const valueToDisplay = result.match({\n Done: (value) => value,\n Loading: () => "Loading ...",\n NotAsked: () => "",\n});\n')),(0,l.kt)("h3",{id:"tapfunc"},".tap(func)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData.tap(func: (asyncData: AsyncData) => unknown): AsyncData\n")),(0,l.kt)("p",null,"Executes ",(0,l.kt)("inlineCode",{parentName:"p"},"func")," with ",(0,l.kt)("inlineCode",{parentName:"p"},"asyncData"),", and returns ",(0,l.kt)("inlineCode",{parentName:"p"},"asyncData"),". Useful for logging and debugging."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"asyncData.tap(console.log).map((x) => x * 2);\n")),(0,l.kt)("h2",{id:"statics"},"Statics"),(0,l.kt)("h3",{id:"asyncdataisasyncdatavalue"},"AsyncData.isAsyncData(value)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"isAsyncData(value: unknown): boolean\n")),(0,l.kt)("p",null,"Type guard, checks if the provided value is an asyncData."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.isAsyncData(AsyncData.Done(1));\n// true\n\nAsyncData.isAsyncData([]);\n// false\n")),(0,l.kt)("h3",{id:"asyncdataallasyncdatas"},"AsyncData.all(asyncDatas)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"all(asyncDatas: Array>): AsyncData>\n")),(0,l.kt)("p",null,'Turns an "array of asyncDatas of value" into a "asyncData of array of value".'),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.all([AsyncData.Done(1), AsyncData.Done(2), AsyncData.Done(3)]);\n// AsyncData.Done<[1, 2, 3]>\n\nAsyncData.all([Result.NotAsked(), AsyncData.Done(2), AsyncData.Done(3)]);\n// AsyncData.NotAsked\n\nAsyncData.all([Result.Loading(), AsyncData.Done(2), AsyncData.Done(3)]);\n// AsyncData.Loading\n")),(0,l.kt)("h3",{id:"asyncdataallfromdictasyncdatas"},"AsyncData.allFromDict(asyncDatas)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"allFromDict(asyncDatas: Dict>): AsyncData>\n")),(0,l.kt)("p",null,'Turns a "dict of asyncDatas of value" into a "asyncData of dict of value".'),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"AsyncData.allFromDict({\n a: AsyncData.Done(1),\n b: AsyncData.Done(2),\n c: AsyncData.Done(3),\n});\n// AsyncData.Done<{a: 1, b: 2, c: 3}>\n\nAsyncData.allFromDict({\n a: Result.NotAsked(),\n b: AsyncData.Done(2),\n c: AsyncData.Done(3),\n});\n// AsyncData.NotAsked\n\nAsyncData.allFromDict({\n a: Result.Loading(),\n b: AsyncData.Done(2),\n c: AsyncData.Done(3),\n});\n// AsyncData.Loading\n")),(0,l.kt)("h2",{id:"ts-pattern-interop"},"TS Pattern interop"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'import { match, P } from "ts-pattern";\nimport { AsyncData } from "@swan-io/boxed";\n\nmatch(asyncData)\n .with(AsyncData.P.Done(P.select()), (value) => console.log(value))\n .with(AsyncData.P.Loading, () => "Loading ...")\n .with(AsyncData.P.NotAsked, () => "")\n .exhaustive();\n')),(0,l.kt)("h2",{id:"cheatsheet"},"Cheatsheet"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Method"),(0,l.kt)("th",{parentName:"tr",align:null},"Input"),(0,l.kt)("th",{parentName:"tr",align:null},"Function input"),(0,l.kt)("th",{parentName:"tr",align:null},"Function output"),(0,l.kt)("th",{parentName:"tr",align:null},"Returned value"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#mapf"},(0,l.kt)("inlineCode",{parentName:"a"},"map"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"y")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(y)"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#mapf"},(0,l.kt)("inlineCode",{parentName:"a"},"map"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Loading()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not provided")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not executed")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Loading()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#mapf"},(0,l.kt)("inlineCode",{parentName:"a"},"map"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"NotAsked()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not provided")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not executed")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"NotAsked()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(y)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(y)"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Loading()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Loading()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Done(x)")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"x")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"NotAsked()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"NotAsked()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Loading()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not provided")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not executed")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"Loading()"))),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("a",{parentName:"td",href:"#flatmapf"},(0,l.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"NotAsked()")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not provided")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("em",{parentName:"td"},"not executed")),(0,l.kt)("td",{parentName:"tr",align:null},(0,l.kt)("inlineCode",{parentName:"td"},"NotAsked()"))))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/977fb8cd.37aac840.js b/assets/js/977fb8cd.37aac840.js new file mode 100644 index 00000000..c76aa7c5 --- /dev/null +++ b/assets/js/977fb8cd.37aac840.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[20],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>f});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function u(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),s=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):u(u({},t),e)),a},p=function(e){var t=s(e.components);return n.createElement(o.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),m=s(a),d=r,f=m["".concat(o,".").concat(d)]||m[d]||c[d]||l;return a?n.createElement(f,u(u({ref:t},p),{},{components:a})):n.createElement(f,u({ref:t},p))}));function f(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,u=new Array(l);u[0]=d;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i[m]="string"==typeof e?e:r,u[1]=i;for(var s=2;s{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>u,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));const l={title:"Future",sidebar_label:"Future"},u=void 0,i={unversionedId:"future",id:"future",title:"Future",description:"The Future is a replacement for Promise.",source:"@site/docs/future.md",sourceDirName:".",slug:"/future",permalink:"/future",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/future.md",tags:[],version:"current",frontMatter:{title:"Future",sidebar_label:"Future"},sidebar:"docs",previous:{title:"AsyncData helpers",permalink:"/async-data-result"},next:{title:"Future helpers",permalink:"/future-result"}},o={},s=[{value:"Main differences with Promises",id:"main-differences-with-promises",level:2},{value:"Create a Future",id:"create-a-future",level:2},{value:"Methods",id:"methods",level:2},{value:".onResolve(f)",id:"onresolvef",level:3},{value:".onCancel(f)",id:"oncancelf",level:3},{value:".map(f)",id:"mapf",level:3},{value:".flatMap(f)",id:"flatmapf",level:3},{value:".tap(f)",id:"tapf",level:3},{value:".toPromise()",id:"topromise",level:3},{value:"Future<Result<Ok, Error>>",id:"futureresultok-error",level:2},{value:"Statics",id:"statics",level:2},{value:"Future.isFuture(value)",id:"futureisfuturevalue",level:3},{value:"Future.all(futures)",id:"futureallfutures",level:3},{value:"Future.concurrent(futureGetters, options)",id:"futureconcurrentfuturegetters-options",level:3},{value:"Future.wait(ms)",id:"futurewaitms",level:3},{value:"Future.allFromDict(futures)",id:"futureallfromdictfutures",level:3},{value:"Future.fromPromise(promise)",id:"futurefrompromisepromise",level:3},{value:"Cancellation",id:"cancellation",level:2},{value:"Basics",id:"basics",level:3},{value:"Bubbling cancellation",id:"bubbling-cancellation",level:3},{value:"Cheatsheet",id:"cheatsheet",level:2}],p={toc:s},m="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"Future")," is a replacement for ",(0,r.kt)("inlineCode",{parentName:"p"},"Promise"),"."),(0,r.kt)("h2",{id:"main-differences-with-promises"},"Main differences with Promises"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Futures don't handle rejection state, instead leaving it to a contained ",(0,r.kt)("inlineCode",{parentName:"li"},"Result")),(0,r.kt)("li",{parentName:"ul"},"Futures have built-in cancellation (and don't reject like the fetch ",(0,r.kt)("inlineCode",{parentName:"li"},"signal")," API does)"),(0,r.kt)("li",{parentName:"ul"},'Futures don\'t "swallow" futures that are returned from ',(0,r.kt)("inlineCode",{parentName:"li"},"map")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"flatMap")),(0,r.kt)("li",{parentName:"ul"},"Future callbacks run synchronously")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Even though we're diverging from ",(0,r.kt)("inlineCode",{parentName:"p"},"Promise"),", you can ",(0,r.kt)("inlineCode",{parentName:"p"},"await")," a ",(0,r.kt)("inlineCode",{parentName:"p"},"Future"),".")),(0,r.kt)("h2",{id:"create-a-future"},"Create a Future"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'import { Future } from "@swan-io/boxed";\n\n// Value\nconst future = Future.value(1);\n\n// Simple future\nconst otherFuture = Future.make((resolve) => {\n resolve(1);\n});\n\n// Future with cancellation effect\nconst otherFuture = Future.make((resolve) => {\n const timeoutId = setTimeout(() => {\n resolve(1);\n }, 1000);\n return () => clearTimeout(timeoutId);\n});\n')),(0,r.kt)("h2",{id:"methods"},"Methods"),(0,r.kt)("h3",{id:"onresolvef"},".onResolve(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"Future.onResolve(func: (value: A) => void): void\n")),(0,r.kt)("p",null,"Runs ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," with the future value as argument when available."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.value(1).onResolve(console.log);\n// Log: 1\n")),(0,r.kt)("h3",{id:"oncancelf"},".onCancel(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"Future.onCancel(func: () => void): void\n")),(0,r.kt)("p",null,"Runs ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," when the future is cancelled."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"future.onCancel(() => {\n // do something\n});\n")),(0,r.kt)("h3",{id:"mapf"},".map(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"Future.map(func: (value: A) => B, propagateCancel?: boolean): Future\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"Future")," and returns a new ",(0,r.kt)("inlineCode",{parentName:"p"},"Future>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.value(3).map((x) => x * 2);\n// Future<6>\n")),(0,r.kt)("h3",{id:"flatmapf"},".flatMap(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"Future.flatMap(func: (value: A) => Future, propagateCancel?: boolean): Future\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"Future"),", and returns a new future taking the value of the future returned by ",(0,r.kt)("inlineCode",{parentName:"p"},"f(A)")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.value(3).flatMap((x) => Future.value(x * 2));\n// Future<6>\n")),(0,r.kt)("h3",{id:"tapf"},".tap(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"Future.tap(func: (value: A) => unknown): Future\n")),(0,r.kt)("p",null,"Runs ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," with the future value, and returns the original future. Useful for debugging."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.value(3).tap(console.log);\n// Log: 3\n// Future<3>\n")),(0,r.kt)("h3",{id:"topromise"},".toPromise()"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"Future.toPromise(): Promise\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"Future")," and returns a ",(0,r.kt)("inlineCode",{parentName:"p"},"Promise")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.value(1).toPromise();\n// Promise<1>\n")),(0,r.kt)("h2",{id:"futureresultok-error"},(0,r.kt)("a",{parentName:"h2",href:"/future-result"},"Future>")),(0,r.kt)("p",null,"We provide ",(0,r.kt)("a",{parentName:"p",href:"/future-result"},"some special helpers")," for ",(0,r.kt)("inlineCode",{parentName:"p"},"Future"),"s containing a ",(0,r.kt)("inlineCode",{parentName:"p"},"Result"),"."),(0,r.kt)("h2",{id:"statics"},"Statics"),(0,r.kt)("h3",{id:"futureisfuturevalue"},"Future.isFuture(value)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"isFuture(value: unknown): boolean\n")),(0,r.kt)("p",null,"Type guard, checks if the provided value is a future."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.isFuture(Future.value(1));\n// true\n\nFuture.isFuture([]);\n// false\n")),(0,r.kt)("h3",{id:"futureallfutures"},"Future.all(futures)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"all(futures: Array>): Future>\n")),(0,r.kt)("p",null,'Turns an "array of futures of values" into a "future of array of value".'),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.all([Future.value(1), Future.value(2), Future.value(3)]);\n// Future<[1, 2, 3]>\n")),(0,r.kt)("h3",{id:"futureconcurrentfuturegetters-options"},"Future.concurrent(futureGetters, options)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"all(futures: Array<() => Future>, {concurrency: number}): Future>\n")),(0,r.kt)("p",null,"Like ",(0,r.kt)("inlineCode",{parentName:"p"},"Future.all")," with a max concurrency, and in order to control the flow, provided with functions returning futures."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.concurrent(\n userIds.map((userId) => {\n // notice we return a function\n return () => getUserById(userId);\n }),\n { concurrency: 10 },\n);\n// Future<[...]>\n")),(0,r.kt)("h3",{id:"futurewaitms"},"Future.wait(ms)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"wait(ms: number): Future\n")),(0,r.kt)("p",null,"Helper to create a future that resolves after ",(0,r.kt)("inlineCode",{parentName:"p"},"ms")," (in milliseconds)."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.wait(1000).tap(() => console.log("Hey"));\n// Logs "Hey" after 1s\n')),(0,r.kt)("h3",{id:"futureallfromdictfutures"},"Future.allFromDict(futures)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"allFromDict(futures: Dict>): Future>\n")),(0,r.kt)("p",null,'Turns a "dict of futures of values" into a "future of dict of value".'),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.allFromDict({\n a: Future.value(1),\n b: Future.value(2),\n c: Future.value(3),\n});\n// Future<{a: 1, b: 2, c: 3}>\n")),(0,r.kt)("h3",{id:"futurefrompromisepromise"},"Future.fromPromise(promise)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"fromPromise(promise: Promise): Future>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"Promise")," and returns a ",(0,r.kt)("a",{parentName:"p",href:"/future-result"},(0,r.kt)("inlineCode",{parentName:"a"},"Future>"))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.fromPromise(Promise.resolve(1));\n// Future>\n\nFuture.fromPromise(Promise.reject(1));\n// Future>\n")),(0,r.kt)("h2",{id:"cancellation"},"Cancellation"),(0,r.kt)("h3",{id:"basics"},"Basics"),(0,r.kt)("p",null,"In JavaScript, ",(0,r.kt)("inlineCode",{parentName:"p"},"Promises")," are not cancellable."),(0,r.kt)("p",null,"That can be limiting at times, especially when using ",(0,r.kt)("inlineCode",{parentName:"p"},"React"),"'s ",(0,r.kt)("inlineCode",{parentName:"p"},"useEffect"),", that let's you return a cancellation effect in order to prevent unwanted side-effects."),(0,r.kt)("p",null,"You can return a cleanup effect from the future ",(0,r.kt)("inlineCode",{parentName:"p"},"init")," function:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const future = Future.make((resolve) => {\n const timeoutId = setTimeout(() => {\n resolve(1);\n }, 1000);\n // will run on cancellation\n return () => clearTimeout(timeoutId);\n});\n")),(0,r.kt)("p",null,"To cancel a ",(0,r.kt)("inlineCode",{parentName:"p"},"future"),", call ",(0,r.kt)("inlineCode",{parentName:"p"},"future.cancel()"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"future.cancel();\n")),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You can only ",(0,r.kt)("inlineCode",{parentName:"p"},"cancel")," a pending future."),(0,r.kt)("p",{parentName:"admonition"},"Calling cancel on a resolved future is a no-op, meaning the future will keep its resolved state.")),(0,r.kt)("p",null,"A cancelled future will automatically cancel any future created from it (e.g. from ",(0,r.kt)("inlineCode",{parentName:"p"},".map")," or ",(0,r.kt)("inlineCode",{parentName:"p"},".flatMap"),"):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const future = Future.make((resolve) => {\n const timeoutId = setTimeout(() => {\n resolve(1);\n }, 1000);\n // will run on cancellation\n return () => clearTimeout(timeoutId);\n});\n\nconst future2 = future.map((x) => x * 2);\n\nfuture.cancel(); // Both `future` and `future2` are cancelled\n")),(0,r.kt)("h3",{id:"bubbling-cancellation"},"Bubbling cancellation"),(0,r.kt)("p",null,"All ",(0,r.kt)("inlineCode",{parentName:"p"},".map*")," and ",(0,r.kt)("inlineCode",{parentName:"p"},".flatMap*")," methods take an extra parameter called ",(0,r.kt)("inlineCode",{parentName:"p"},"propagateCancel"),", it enables the returned future ",(0,r.kt)("inlineCode",{parentName:"p"},"cancel")," to bubble up cancellation to its depedencies:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// disabled by default: cancelling `future2` will not cancel `future`\nconst future2 = future.map((x) => x * 2);\n\n// optin: cancelling `future2` will cancel `future`\nconst future2 = future.map((x) => x * 2, true);\n")),(0,r.kt)("p",null,"This can be useful at call site:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const request = apiCall().map(parse, true);\n\nrequest.cancel(); // will run the cleanup effect in `apiCall`\n")),(0,r.kt)("h2",{id:"cheatsheet"},"Cheatsheet"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Method"),(0,r.kt)("th",{parentName:"tr",align:null},"Input"),(0,r.kt)("th",{parentName:"tr",align:null},"Function input"),(0,r.kt)("th",{parentName:"tr",align:null},"Function output"),(0,r.kt)("th",{parentName:"tr",align:null},"Returned value"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#mapf"},(0,r.kt)("inlineCode",{parentName:"a"},"map"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Future(x)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"y")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Future(y)"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmapf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Future(x)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Future(y)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Future(y)"))))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/977fb8cd.48a989ec.js b/assets/js/977fb8cd.48a989ec.js deleted file mode 100644 index 029258bd..00000000 --- a/assets/js/977fb8cd.48a989ec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[20],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>f});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function u(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),s=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):u(u({},t),e)),a},p=function(e){var t=s(e.components);return n.createElement(o.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),m=s(a),d=r,f=m["".concat(o,".").concat(d)]||m[d]||c[d]||l;return a?n.createElement(f,u(u({ref:t},p),{},{components:a})):n.createElement(f,u({ref:t},p))}));function f(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,u=new Array(l);u[0]=d;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i[m]="string"==typeof e?e:r,u[1]=i;for(var s=2;s{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>u,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));const l={title:"Future",sidebar_label:"Future"},u=void 0,i={unversionedId:"future",id:"future",title:"Future",description:"The Future is a replacement for Promise.",source:"@site/docs/future.md",sourceDirName:".",slug:"/future",permalink:"/boxed/future",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/future.md",tags:[],version:"current",frontMatter:{title:"Future",sidebar_label:"Future"},sidebar:"docs",previous:{title:"AsyncData helpers",permalink:"/boxed/async-data-result"},next:{title:"Future helpers",permalink:"/boxed/future-result"}},o={},s=[{value:"Main differences with Promises",id:"main-differences-with-promises",level:2},{value:"Create a Future",id:"create-a-future",level:2},{value:"Methods",id:"methods",level:2},{value:".onResolve(f)",id:"onresolvef",level:3},{value:".onCancel(f)",id:"oncancelf",level:3},{value:".map(f)",id:"mapf",level:3},{value:".flatMap(f)",id:"flatmapf",level:3},{value:".tap(f)",id:"tapf",level:3},{value:".toPromise()",id:"topromise",level:3},{value:"Future<Result<Ok, Error>>",id:"futureresultok-error",level:2},{value:"Statics",id:"statics",level:2},{value:"Future.isFuture(value)",id:"futureisfuturevalue",level:3},{value:"Future.all(futures)",id:"futureallfutures",level:3},{value:"Future.concurrent(futureGetters, options)",id:"futureconcurrentfuturegetters-options",level:3},{value:"Future.wait(ms)",id:"futurewaitms",level:3},{value:"Future.allFromDict(futures)",id:"futureallfromdictfutures",level:3},{value:"Future.fromPromise(promise)",id:"futurefrompromisepromise",level:3},{value:"Cancellation",id:"cancellation",level:2},{value:"Basics",id:"basics",level:3},{value:"Bubbling cancellation",id:"bubbling-cancellation",level:3},{value:"Cheatsheet",id:"cheatsheet",level:2}],p={toc:s},m="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(m,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"Future")," is a replacement for ",(0,r.kt)("inlineCode",{parentName:"p"},"Promise"),"."),(0,r.kt)("h2",{id:"main-differences-with-promises"},"Main differences with Promises"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Futures don't handle rejection state, instead leaving it to a contained ",(0,r.kt)("inlineCode",{parentName:"li"},"Result")),(0,r.kt)("li",{parentName:"ul"},"Futures have built-in cancellation (and don't reject like the fetch ",(0,r.kt)("inlineCode",{parentName:"li"},"signal")," API does)"),(0,r.kt)("li",{parentName:"ul"},'Futures don\'t "swallow" futures that are returned from ',(0,r.kt)("inlineCode",{parentName:"li"},"map")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"flatMap")),(0,r.kt)("li",{parentName:"ul"},"Future callbacks run synchronously")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Even though we're diverging from ",(0,r.kt)("inlineCode",{parentName:"p"},"Promise"),", you can ",(0,r.kt)("inlineCode",{parentName:"p"},"await")," a ",(0,r.kt)("inlineCode",{parentName:"p"},"Future"),".")),(0,r.kt)("h2",{id:"create-a-future"},"Create a Future"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'import { Future } from "@swan-io/boxed";\n\n// Value\nconst future = Future.value(1);\n\n// Simple future\nconst otherFuture = Future.make((resolve) => {\n resolve(1);\n});\n\n// Future with cancellation effect\nconst otherFuture = Future.make((resolve) => {\n const timeoutId = setTimeout(() => {\n resolve(1);\n }, 1000);\n return () => clearTimeout(timeoutId);\n});\n')),(0,r.kt)("h2",{id:"methods"},"Methods"),(0,r.kt)("h3",{id:"onresolvef"},".onResolve(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"Future.onResolve(func: (value: A) => void): void\n")),(0,r.kt)("p",null,"Runs ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," with the future value as argument when available."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.value(1).onResolve(console.log);\n// Log: 1\n")),(0,r.kt)("h3",{id:"oncancelf"},".onCancel(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"Future.onCancel(func: () => void): void\n")),(0,r.kt)("p",null,"Runs ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," when the future is cancelled."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"future.onCancel(() => {\n // do something\n});\n")),(0,r.kt)("h3",{id:"mapf"},".map(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"Future.map(func: (value: A) => B, propagateCancel?: boolean): Future\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"Future")," and returns a new ",(0,r.kt)("inlineCode",{parentName:"p"},"Future>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.value(3).map((x) => x * 2);\n// Future<6>\n")),(0,r.kt)("h3",{id:"flatmapf"},".flatMap(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"Future.flatMap(func: (value: A) => Future, propagateCancel?: boolean): Future\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"Future"),", and returns a new future taking the value of the future returned by ",(0,r.kt)("inlineCode",{parentName:"p"},"f(A)")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.value(3).flatMap((x) => Future.value(x * 2));\n// Future<6>\n")),(0,r.kt)("h3",{id:"tapf"},".tap(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"Future.tap(func: (value: A) => unknown): Future\n")),(0,r.kt)("p",null,"Runs ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," with the future value, and returns the original future. Useful for debugging."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.value(3).tap(console.log);\n// Log: 3\n// Future<3>\n")),(0,r.kt)("h3",{id:"topromise"},".toPromise()"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"Future.toPromise(): Promise\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"Future")," and returns a ",(0,r.kt)("inlineCode",{parentName:"p"},"Promise")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.value(1).toPromise();\n// Promise<1>\n")),(0,r.kt)("h2",{id:"futureresultok-error"},(0,r.kt)("a",{parentName:"h2",href:"/future-result"},"Future>")),(0,r.kt)("p",null,"We provide ",(0,r.kt)("a",{parentName:"p",href:"/future-result"},"some special helpers")," for ",(0,r.kt)("inlineCode",{parentName:"p"},"Future"),"s containing a ",(0,r.kt)("inlineCode",{parentName:"p"},"Result"),"."),(0,r.kt)("h2",{id:"statics"},"Statics"),(0,r.kt)("h3",{id:"futureisfuturevalue"},"Future.isFuture(value)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"isFuture(value: unknown): boolean\n")),(0,r.kt)("p",null,"Type guard, checks if the provided value is a future."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.isFuture(Future.value(1));\n// true\n\nFuture.isFuture([]);\n// false\n")),(0,r.kt)("h3",{id:"futureallfutures"},"Future.all(futures)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"all(futures: Array>): Future>\n")),(0,r.kt)("p",null,'Turns an "array of futures of values" into a "future of array of value".'),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.all([Future.value(1), Future.value(2), Future.value(3)]);\n// Future<[1, 2, 3]>\n")),(0,r.kt)("h3",{id:"futureconcurrentfuturegetters-options"},"Future.concurrent(futureGetters, options)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"all(futures: Array<() => Future>, {concurrency: number}): Future>\n")),(0,r.kt)("p",null,"Like ",(0,r.kt)("inlineCode",{parentName:"p"},"Future.all")," with a max concurrency, and in order to control the flow, provided with functions returning futures."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.concurrent(\n userIds.map((userId) => {\n // notice we return a function\n return () => getUserById(userId);\n }),\n { concurrency: 10 },\n);\n// Future<[...]>\n")),(0,r.kt)("h3",{id:"futurewaitms"},"Future.wait(ms)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"wait(ms: number): Future\n")),(0,r.kt)("p",null,"Helper to create a future that resolves after ",(0,r.kt)("inlineCode",{parentName:"p"},"ms")," (in milliseconds)."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Future.wait(1000).tap(() => console.log("Hey"));\n// Logs "Hey" after 1s\n')),(0,r.kt)("h3",{id:"futureallfromdictfutures"},"Future.allFromDict(futures)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"allFromDict(futures: Dict>): Future>\n")),(0,r.kt)("p",null,'Turns a "dict of futures of values" into a "future of dict of value".'),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.allFromDict({\n a: Future.value(1),\n b: Future.value(2),\n c: Future.value(3),\n});\n// Future<{a: 1, b: 2, c: 3}>\n")),(0,r.kt)("h3",{id:"futurefrompromisepromise"},"Future.fromPromise(promise)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"fromPromise(promise: Promise): Future>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"Promise")," and returns a ",(0,r.kt)("a",{parentName:"p",href:"/future-result"},(0,r.kt)("inlineCode",{parentName:"a"},"Future>"))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Future.fromPromise(Promise.resolve(1));\n// Future>\n\nFuture.fromPromise(Promise.reject(1));\n// Future>\n")),(0,r.kt)("h2",{id:"cancellation"},"Cancellation"),(0,r.kt)("h3",{id:"basics"},"Basics"),(0,r.kt)("p",null,"In JavaScript, ",(0,r.kt)("inlineCode",{parentName:"p"},"Promises")," are not cancellable."),(0,r.kt)("p",null,"That can be limiting at times, especially when using ",(0,r.kt)("inlineCode",{parentName:"p"},"React"),"'s ",(0,r.kt)("inlineCode",{parentName:"p"},"useEffect"),", that let's you return a cancellation effect in order to prevent unwanted side-effects."),(0,r.kt)("p",null,"You can return a cleanup effect from the future ",(0,r.kt)("inlineCode",{parentName:"p"},"init")," function:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const future = Future.make((resolve) => {\n const timeoutId = setTimeout(() => {\n resolve(1);\n }, 1000);\n // will run on cancellation\n return () => clearTimeout(timeoutId);\n});\n")),(0,r.kt)("p",null,"To cancel a ",(0,r.kt)("inlineCode",{parentName:"p"},"future"),", call ",(0,r.kt)("inlineCode",{parentName:"p"},"future.cancel()"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"future.cancel();\n")),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You can only ",(0,r.kt)("inlineCode",{parentName:"p"},"cancel")," a pending future."),(0,r.kt)("p",{parentName:"admonition"},"Calling cancel on a resolved future is a no-op, meaning the future will keep its resolved state.")),(0,r.kt)("p",null,"A cancelled future will automatically cancel any future created from it (e.g. from ",(0,r.kt)("inlineCode",{parentName:"p"},".map")," or ",(0,r.kt)("inlineCode",{parentName:"p"},".flatMap"),"):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const future = Future.make((resolve) => {\n const timeoutId = setTimeout(() => {\n resolve(1);\n }, 1000);\n // will run on cancellation\n return () => clearTimeout(timeoutId);\n});\n\nconst future2 = future.map((x) => x * 2);\n\nfuture.cancel(); // Both `future` and `future2` are cancelled\n")),(0,r.kt)("h3",{id:"bubbling-cancellation"},"Bubbling cancellation"),(0,r.kt)("p",null,"All ",(0,r.kt)("inlineCode",{parentName:"p"},".map*")," and ",(0,r.kt)("inlineCode",{parentName:"p"},".flatMap*")," methods take an extra parameter called ",(0,r.kt)("inlineCode",{parentName:"p"},"propagateCancel"),", it enables the returned future ",(0,r.kt)("inlineCode",{parentName:"p"},"cancel")," to bubble up cancellation to its depedencies:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// disabled by default: cancelling `future2` will not cancel `future`\nconst future2 = future.map((x) => x * 2);\n\n// optin: cancelling `future2` will cancel `future`\nconst future2 = future.map((x) => x * 2, true);\n")),(0,r.kt)("p",null,"This can be useful at call site:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const request = apiCall().map(parse, true);\n\nrequest.cancel(); // will run the cleanup effect in `apiCall`\n")),(0,r.kt)("h2",{id:"cheatsheet"},"Cheatsheet"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Method"),(0,r.kt)("th",{parentName:"tr",align:null},"Input"),(0,r.kt)("th",{parentName:"tr",align:null},"Function input"),(0,r.kt)("th",{parentName:"tr",align:null},"Function output"),(0,r.kt)("th",{parentName:"tr",align:null},"Returned value"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#mapf"},(0,r.kt)("inlineCode",{parentName:"a"},"map"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Future(x)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"y")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Future(y)"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmapf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Future(x)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Future(y)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Future(y)"))))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/984db706.7f39fe1a.js b/assets/js/984db706.7f39fe1a.js new file mode 100644 index 00000000..8a9bc2ee --- /dev/null +++ b/assets/js/984db706.7f39fe1a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[675],{3905:(t,e,a)=>{a.d(e,{Zo:()=>k,kt:()=>N});var n=a(7294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function o(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var i=n.createContext({}),d=function(t){var e=n.useContext(i),a=e;return t&&(a="function"==typeof t?t(e):o(o({},e),t)),a},k=function(t){var e=d(t.components);return n.createElement(i.Provider,{value:e},t.children)},m="mdxType",u={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,i=t.parentName,k=p(t,["components","mdxType","originalType","parentName"]),m=d(a),s=r,N=m["".concat(i,".").concat(s)]||m[s]||u[s]||l;return a?n.createElement(N,o(o({ref:e},k),{},{components:a})):n.createElement(N,o({ref:e},k))}));function N(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,o=new Array(l);o[0]=s;var p={};for(var i in e)hasOwnProperty.call(e,i)&&(p[i]=e[i]);p.originalType=t,p[m]="string"==typeof t?t:r,o[1]=p;for(var d=2;d{a.r(e),a.d(e,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>p,toc:()=>d});var n=a(7462),r=(a(7294),a(3905));const l={title:"AsyncData>",sidebar_label:"AsyncData helpers"},o=void 0,p={unversionedId:"async-data-result",id:"async-data-result",title:"AsyncData>",description:"A AsyncData can contain a Result (e.g. to represent an asynchronous value that can fail). We provide some utility functions to deal with that case without having to unwrap the AsyncData result.",source:"@site/docs/async-data-result.md",sourceDirName:".",slug:"/async-data-result",permalink:"/async-data-result",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/async-data-result.md",tags:[],version:"current",frontMatter:{title:"AsyncData>",sidebar_label:"AsyncData helpers"},sidebar:"docs",previous:{title:"AsyncData",permalink:"/async-data"},next:{title:"Future",permalink:"/future"}},i={},d=[{value:"Methods",id:"methods",level:2},{value:".mapOkToResult(f)",id:"mapoktoresultf",level:3},{value:".mapErrorToResult(f)",id:"maperrortoresultf",level:3},{value:".mapOk(f)",id:"mapokf",level:3},{value:".mapError(f)",id:"maperrorf",level:3},{value:".flatMapOk(f)",id:"flatmapokf",level:3},{value:".flatMapError(f)",id:"flatmaperrorf",level:3},{value:"Cheatsheet",id:"cheatsheet",level:2}],k={toc:d},m="wrapper";function u(t){let{components:e,...a}=t;return(0,r.kt)(m,(0,n.Z)({},k,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"A ",(0,r.kt)("a",{parentName:"p",href:"./async-data"},"AsyncData")," can contain a ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," (e.g. to represent an asynchronous value that can fail). We provide some utility functions to deal with that case without having to unwrap the AsyncData result."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You can still use all the regular ",(0,r.kt)("a",{parentName:"p",href:"./async-data"},"AsyncData")," methods. The following helpers simply removes the need to unwrap the contained result.")),(0,r.kt)("h2",{id:"methods"},"Methods"),(0,r.kt)("h3",{id:"mapoktoresultf"},".mapOkToResult(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData>.mapOkToResult(\n func: (value: A) => Result,\n): AsyncData>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok")," and returning ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," and returns a new ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'AsyncData.Done(Result.Ok(3)).mapOkToResult((ok) => {\n return Result.Ok(ok * 2);\n});\n// AsyncData>\n\nAsyncData.Done(Result.Ok(3)).mapOkToResult((ok) =>\n isEven(ok) ? Result.Ok(ok) : Result.Error("Odd number");\n);\n// AsyncData>\n')),(0,r.kt)("h3",{id:"maperrortoresultf"},".mapErrorToResult(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData>.mapErrorToResult(\n func: (value: E) => Result,\n): AsyncData>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,r.kt)("inlineCode",{parentName:"p"},"Error")," and returning ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," and returns a new ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'AsyncData.Done(Result.Error(3)).mapErrorToResult((error) => {\n return Result.Ok(ok * 2);\n});\n// AsyncData>\n\nAsyncData.Done(Result.Error(3)).mapErrorToResult((error) =>\n isEven(error) ? Result.Ok(error) : Result.Error("Odd number");\n);\n// AsyncData>\n')),(0,r.kt)("h3",{id:"mapokf"},".mapOk(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData>.mapOk(\n func: (value: A) => B,\n): AsyncData>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok")," and returning ",(0,r.kt)("inlineCode",{parentName:"p"},"ReturnValue")," and returns a new ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'AsyncData.Done(Result.Ok(3)).mapOk((ok) => {\n return ok * 2;\n});\n// AsyncData>\n\nAsyncData.Done(Result.Error("something")).mapOk((ok) => {\n return ok * 2;\n});\n// AsyncData>\n')),(0,r.kt)("h3",{id:"maperrorf"},".mapError(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData>.mapError(\n func: (value: E) => F,\n): AsyncData>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,r.kt)("inlineCode",{parentName:"p"},"Error")," and returning ",(0,r.kt)("inlineCode",{parentName:"p"},"ReturnValue")," and returns a new ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'AsyncData.Done(Result.Error(3)).mapError((error) => {\n return error * 2;\n});\n// AsyncData>\n\nAsyncData.Done(Result.Ok("something")).mapError((ok) => {\n return ok * 2;\n});\n// AsyncData>\n')),(0,r.kt)("h3",{id:"flatmapokf"},".flatMapOk(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData>.flatMapOk(\n func: (value: A) => AsyncData>,\n): AsyncData>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok")," returning a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'AsyncData.Done(Result.Ok(3)).flatMapOk((ok) =>\n AsyncData.Done(Result.Ok(ok * 2)),\n);\n// AsyncData>\n\nAsyncData.Done(Result.Ok(3)).flatMapOk((ok) =>\n AsyncData.Done(Result.Error("Nope")),\n);\n// AsyncData>\n\nAsyncData.Done(Result.Error("Error")).flatMapOk((ok) =>\n AsyncData.Done(Result.Ok(ok * 2)),\n);\n// AsyncData>\n')),(0,r.kt)("h3",{id:"flatmaperrorf"},".flatMapError(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData>.flatMapError(\n func: (value: E) => AsyncData>,\n): AsyncData>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,r.kt)("inlineCode",{parentName:"p"},"Error")," returning a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'AsyncData.Done(Result.Ok(3)).flatMapError((error) =>\n AsyncData.Done(Result.Ok(ok * 2)),\n);\n// AsyncData>\n\nAsyncData.Done(Result.Error("Error")).flatMapError((error) =>\n AsyncData.Done(Result.Error("Nope")),\n);\n// AsyncData>\n\nAsyncData.Done(Result.Error("Error")).flatMapError((error) =>\n AsyncData.Done(Result.Ok(1)),\n);\n// AsyncData>\n')),(0,r.kt)("h2",{id:"cheatsheet"},"Cheatsheet"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Method"),(0,r.kt)("th",{parentName:"tr",align:null},"Input"),(0,r.kt)("th",{parentName:"tr",align:null},"Function input"),(0,r.kt)("th",{parentName:"tr",align:null},"Function output"),(0,r.kt)("th",{parentName:"tr",align:null},"Returned value"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#mapoktoresultf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapOkToResult"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Ok(y)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#mapoktoresultf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapOkToResult"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Error(f)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#mapoktoresultf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapOkToResult"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not provided")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not executed")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#maperrortoresultf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapErrorToResult"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"e")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Ok(y)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#maperrortoresultf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapErrorToResult"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"e")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Error(f)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#maperrortoresultf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapErrorToResult"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not provided")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not executed")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#mapokf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapOk"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"y")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#mapokf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapOk"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not provided")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not executed")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#maperrorf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapError"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not provided")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not executed")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#maperrorf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapError"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"e")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"f")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmapokf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMapOk"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmapokf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMapOk"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmapokf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMapOk"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not provided")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not executed")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not provided")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not executed")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"e")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"e")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))"))))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/984db706.ef09508a.js b/assets/js/984db706.ef09508a.js deleted file mode 100644 index 0495c629..00000000 --- a/assets/js/984db706.ef09508a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[675],{3905:(t,e,a)=>{a.d(e,{Zo:()=>k,kt:()=>N});var n=a(7294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function l(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function o(t){for(var e=1;e=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var i=n.createContext({}),d=function(t){var e=n.useContext(i),a=e;return t&&(a="function"==typeof t?t(e):o(o({},e),t)),a},k=function(t){var e=d(t.components);return n.createElement(i.Provider,{value:e},t.children)},m="mdxType",u={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,l=t.originalType,i=t.parentName,k=p(t,["components","mdxType","originalType","parentName"]),m=d(a),s=r,N=m["".concat(i,".").concat(s)]||m[s]||u[s]||l;return a?n.createElement(N,o(o({ref:e},k),{},{components:a})):n.createElement(N,o({ref:e},k))}));function N(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var l=a.length,o=new Array(l);o[0]=s;var p={};for(var i in e)hasOwnProperty.call(e,i)&&(p[i]=e[i]);p.originalType=t,p[m]="string"==typeof t?t:r,o[1]=p;for(var d=2;d{a.r(e),a.d(e,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>p,toc:()=>d});var n=a(7462),r=(a(7294),a(3905));const l={title:"AsyncData>",sidebar_label:"AsyncData helpers"},o=void 0,p={unversionedId:"async-data-result",id:"async-data-result",title:"AsyncData>",description:"A AsyncData can contain a Result (e.g. to represent an asynchronous value that can fail). We provide some utility functions to deal with that case without having to unwrap the AsyncData result.",source:"@site/docs/async-data-result.md",sourceDirName:".",slug:"/async-data-result",permalink:"/boxed/async-data-result",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/async-data-result.md",tags:[],version:"current",frontMatter:{title:"AsyncData>",sidebar_label:"AsyncData helpers"},sidebar:"docs",previous:{title:"AsyncData",permalink:"/boxed/async-data"},next:{title:"Future",permalink:"/boxed/future"}},i={},d=[{value:"Methods",id:"methods",level:2},{value:".mapOkToResult(f)",id:"mapoktoresultf",level:3},{value:".mapErrorToResult(f)",id:"maperrortoresultf",level:3},{value:".mapOk(f)",id:"mapokf",level:3},{value:".mapError(f)",id:"maperrorf",level:3},{value:".flatMapOk(f)",id:"flatmapokf",level:3},{value:".flatMapError(f)",id:"flatmaperrorf",level:3},{value:"Cheatsheet",id:"cheatsheet",level:2}],k={toc:d},m="wrapper";function u(t){let{components:e,...a}=t;return(0,r.kt)(m,(0,n.Z)({},k,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"A ",(0,r.kt)("a",{parentName:"p",href:"./async-data"},"AsyncData")," can contain a ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," (e.g. to represent an asynchronous value that can fail). We provide some utility functions to deal with that case without having to unwrap the AsyncData result."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You can still use all the regular ",(0,r.kt)("a",{parentName:"p",href:"./async-data"},"AsyncData")," methods. The following helpers simply removes the need to unwrap the contained result.")),(0,r.kt)("h2",{id:"methods"},"Methods"),(0,r.kt)("h3",{id:"mapoktoresultf"},".mapOkToResult(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData>.mapOkToResult(\n func: (value: A) => Result,\n): AsyncData>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok")," and returning ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," and returns a new ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'AsyncData.Done(Result.Ok(3)).mapOkToResult((ok) => {\n return Result.Ok(ok * 2);\n});\n// AsyncData>\n\nAsyncData.Done(Result.Ok(3)).mapOkToResult((ok) =>\n isEven(ok) ? Result.Ok(ok) : Result.Error("Odd number");\n);\n// AsyncData>\n')),(0,r.kt)("h3",{id:"maperrortoresultf"},".mapErrorToResult(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData>.mapErrorToResult(\n func: (value: E) => Result,\n): AsyncData>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,r.kt)("inlineCode",{parentName:"p"},"Error")," and returning ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," and returns a new ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'AsyncData.Done(Result.Error(3)).mapErrorToResult((error) => {\n return Result.Ok(ok * 2);\n});\n// AsyncData>\n\nAsyncData.Done(Result.Error(3)).mapErrorToResult((error) =>\n isEven(error) ? Result.Ok(error) : Result.Error("Odd number");\n);\n// AsyncData>\n')),(0,r.kt)("h3",{id:"mapokf"},".mapOk(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData>.mapOk(\n func: (value: A) => B,\n): AsyncData>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok")," and returning ",(0,r.kt)("inlineCode",{parentName:"p"},"ReturnValue")," and returns a new ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'AsyncData.Done(Result.Ok(3)).mapOk((ok) => {\n return ok * 2;\n});\n// AsyncData>\n\nAsyncData.Done(Result.Error("something")).mapOk((ok) => {\n return ok * 2;\n});\n// AsyncData>\n')),(0,r.kt)("h3",{id:"maperrorf"},".mapError(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData>.mapError(\n func: (value: E) => F,\n): AsyncData>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,r.kt)("inlineCode",{parentName:"p"},"Error")," and returning ",(0,r.kt)("inlineCode",{parentName:"p"},"ReturnValue")," and returns a new ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'AsyncData.Done(Result.Error(3)).mapError((error) => {\n return error * 2;\n});\n// AsyncData>\n\nAsyncData.Done(Result.Ok("something")).mapError((ok) => {\n return ok * 2;\n});\n// AsyncData>\n')),(0,r.kt)("h3",{id:"flatmapokf"},".flatMapOk(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData>.flatMapOk(\n func: (value: A) => AsyncData>,\n): AsyncData>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok")," returning a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'AsyncData.Done(Result.Ok(3)).flatMapOk((ok) =>\n AsyncData.Done(Result.Ok(ok * 2)),\n);\n// AsyncData>\n\nAsyncData.Done(Result.Ok(3)).flatMapOk((ok) =>\n AsyncData.Done(Result.Error("Nope")),\n);\n// AsyncData>\n\nAsyncData.Done(Result.Error("Error")).flatMapOk((ok) =>\n AsyncData.Done(Result.Ok(ok * 2)),\n);\n// AsyncData>\n')),(0,r.kt)("h3",{id:"flatmaperrorf"},".flatMapError(f)"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"AsyncData>.flatMapError(\n func: (value: E) => AsyncData>,\n): AsyncData>\n")),(0,r.kt)("p",null,"Takes a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," function taking ",(0,r.kt)("inlineCode",{parentName:"p"},"Error")," returning a ",(0,r.kt)("inlineCode",{parentName:"p"},"AsyncData>")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'AsyncData.Done(Result.Ok(3)).flatMapError((error) =>\n AsyncData.Done(Result.Ok(ok * 2)),\n);\n// AsyncData>\n\nAsyncData.Done(Result.Error("Error")).flatMapError((error) =>\n AsyncData.Done(Result.Error("Nope")),\n);\n// AsyncData>\n\nAsyncData.Done(Result.Error("Error")).flatMapError((error) =>\n AsyncData.Done(Result.Ok(1)),\n);\n// AsyncData>\n')),(0,r.kt)("h2",{id:"cheatsheet"},"Cheatsheet"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Method"),(0,r.kt)("th",{parentName:"tr",align:null},"Input"),(0,r.kt)("th",{parentName:"tr",align:null},"Function input"),(0,r.kt)("th",{parentName:"tr",align:null},"Function output"),(0,r.kt)("th",{parentName:"tr",align:null},"Returned value"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#mapoktoresultf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapOkToResult"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Ok(y)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#mapoktoresultf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapOkToResult"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Error(f)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#mapoktoresultf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapOkToResult"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not provided")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not executed")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#maperrortoresultf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapErrorToResult"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"e")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Ok(y)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#maperrortoresultf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapErrorToResult"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"e")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"Error(f)")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#maperrortoresultf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapErrorToResult"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not provided")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not executed")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#mapokf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapOk"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"y")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#mapokf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapOk"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not provided")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not executed")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#maperrorf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapError"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not provided")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not executed")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#maperrorf"},(0,r.kt)("inlineCode",{parentName:"a"},"mapError"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"e")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"f")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmapokf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMapOk"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmapokf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMapOk"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"x")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmapokf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMapOk"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not provided")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not executed")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not provided")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"not executed")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(x))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"e")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Ok(y))"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,r.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(e))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"e")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"AsyncData(Error(f))"))))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a7da88a7.952aad6a.js b/assets/js/a7da88a7.952aad6a.js deleted file mode 100644 index 0f9a244c..00000000 --- a/assets/js/a7da88a7.952aad6a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[611],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),l=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=l(r),d=o,m=u["".concat(s,".").concat(d)]||u[d]||f[d]||i;return r?n.createElement(m,a(a({ref:t},p),{},{components:r})):n.createElement(m,a({ref:t},p))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[u]="string"==typeof e?e:o,a[1]=c;for(var l=2;l{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>f,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const i={title:"Inspirations",sidebar_label:"Inspirations"},a=void 0,c={unversionedId:"inspirations",id:"inspirations",title:"Inspirations",description:"- ReScript's Belt Stdlib",source:"@site/docs/inspirations.md",sourceDirName:".",slug:"/inspirations",permalink:"/boxed/inspirations",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/inspirations.md",tags:[],version:"current",frontMatter:{title:"Inspirations",sidebar_label:"Inspirations"},sidebar:"docs",previous:{title:"Concurrency",permalink:"/boxed/concurrency"}},s={},l=[],p={toc:l},u="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://rescript-lang.org/docs/manual/latest/api/belt"},"ReScript's Belt Stdlib")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/bloodyowl/rescript-future"},"ReScript Future")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/bloodyowl/rescript-asyncdata"},"ReScript AsyncData"))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a7da88a7.bee90fb0.js b/assets/js/a7da88a7.bee90fb0.js new file mode 100644 index 00000000..9430a9f5 --- /dev/null +++ b/assets/js/a7da88a7.bee90fb0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[611],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var s=n.createContext({}),l=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=l(r),d=i,m=u["".concat(s,".").concat(d)]||u[d]||f[d]||o;return r?n.createElement(m,a(a({ref:t},p),{},{components:r})):n.createElement(m,a({ref:t},p))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[u]="string"==typeof e?e:i,a[1]=c;for(var l=2;l{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>f,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var n=r(7462),i=(r(7294),r(3905));const o={title:"Inspirations",sidebar_label:"Inspirations"},a=void 0,c={unversionedId:"inspirations",id:"inspirations",title:"Inspirations",description:"- ReScript's Belt Stdlib",source:"@site/docs/inspirations.md",sourceDirName:".",slug:"/inspirations",permalink:"/inspirations",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/inspirations.md",tags:[],version:"current",frontMatter:{title:"Inspirations",sidebar_label:"Inspirations"},sidebar:"docs",previous:{title:"Concurrency",permalink:"/concurrency"}},s={},l=[],p={toc:l},u="wrapper";function f(e){let{components:t,...r}=e;return(0,i.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://rescript-lang.org/docs/manual/latest/api/belt"},"ReScript's Belt Stdlib")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/bloodyowl/rescript-future"},"ReScript Future")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/bloodyowl/rescript-asyncdata"},"ReScript AsyncData"))))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ace312b1.0e941d12.js b/assets/js/ace312b1.0e941d12.js deleted file mode 100644 index 91c0711e..00000000 --- a/assets/js/ace312b1.0e941d12.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[527],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>c});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),s=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",k={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=s(r),d=n,c=m["".concat(p,".").concat(d)]||m[d]||k[d]||l;return r?a.createElement(c,o(o({ref:t},u),{},{components:r})):a.createElement(c,o({ref:t},u))}));function c(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:n,o[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>k,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var a=r(7462),n=(r(7294),r(3905));const l={title:"Result",sidebar_label:"Result"},o=void 0,i={unversionedId:"result",id:"result",title:"Result",description:"The Result can replace exception flows.",source:"@site/docs/result.md",sourceDirName:".",slug:"/result",permalink:"/boxed/result",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/result.md",tags:[],version:"current",frontMatter:{title:"Result",sidebar_label:"Result"},sidebar:"docs",previous:{title:"Option",permalink:"/boxed/option"},next:{title:"AsyncData",permalink:"/boxed/async-data"}},p={},s=[{value:"Create a Result value",id:"create-a-result-value",level:2},{value:"Methods",id:"methods",level:2},{value:".map(f)",id:"mapf",level:3},{value:".mapError(f)",id:"maperrorf",level:3},{value:".flatMap(f)",id:"flatmapf",level:3},{value:".flatMapError(f)",id:"flatmaperrorf",level:3},{value:".getOr(defaultValue)",id:"getordefaultvalue",level:3},{value:".mapOr(defaultValue, mapper)",id:"mapordefaultvalue-mapper",level:3},{value:".get()",id:"get",level:3},{value:".getError()",id:"geterror",level:3},{value:".isOk()",id:"isok",level:3},{value:".isError()",id:"iserror",level:3},{value:".toOption()",id:"tooption",level:3},{value:".match()",id:"match",level:3},{value:".tap(func)",id:"tapfunc",level:3},{value:".tapOk(func)",id:"tapokfunc",level:3},{value:".tapError(func)",id:"taperrorfunc",level:3},{value:"Statics",id:"statics",level:2},{value:"Result.fromPredicate(value, predicate, error)",id:"resultfrompredicatevalue-predicate-error",level:3},{value:"Result.isResult(value)",id:"resultisresultvalue",level:3},{value:"Result.all(results)",id:"resultallresults",level:3},{value:"Result.allFromDict(results)",id:"resultallfromdictresults",level:3},{value:"Result.fromExecution(() => value)",id:"resultfromexecution--value",level:3},{value:"Result.fromPromise(promise)",id:"resultfrompromisepromise",level:3},{value:"Result.fromOption(option, valueIfNone)",id:"resultfromoptionoption-valueifnone",level:3},{value:"TS Pattern interop",id:"ts-pattern-interop",level:2},{value:"Cheatsheet",id:"cheatsheet",level:2}],u={toc:s},m="wrapper";function k(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")," can replace exception flows."),(0,n.kt)("p",null,"Exceptions can be tricky to handle: there's nothing in the type system that tracks if an error has been handled, which is error prone, and adds to your mental overhead. ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")," helps as it ",(0,n.kt)("strong",{parentName:"p"},"makes the value hold the success state"),", making it dead-simple to track with a type-system."),(0,n.kt)("p",null,"Just like the ",(0,n.kt)("inlineCode",{parentName:"p"},"Option")," type, the ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")," type is a box that can have two states:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Ok(value)")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Error(error)"))),(0,n.kt)("h2",{id:"create-a-result-value"},"Create a Result value"),(0,n.kt)("p",null,"To create a result, use the ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," constructors:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},'import { Result } from "@swan-io/boxed";\n\nconst ok = Result.Ok(1);\n\nconst notOk = Result.Error("something happened");\n')),(0,n.kt)("p",null,"You can convert an option to a ",(0,n.kt)("inlineCode",{parentName:"p"},"Result"),":"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},'import { Result, Option } from "@swan-io/boxed";\n\nconst a = Result.fromOption(Option.Some(1), "NotFound");\n// Ok<1>\n\nconst b = Result.fromOption(Option.None(), "NotFound");\n// Error<"NotFound">\n')),(0,n.kt)("p",null,"You get interop with exceptions and promises:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},'// Let\'s say you have some function that throws an error\nconst init = (id: string) => {\n if (id.length !== 24) {\n throw new Error();\n }\n return new Client({ id });\n};\n\nconst result = Result.fromExecution(() => init(id));\n// Here, result will either be:\n// - Ok(client)\n// - Error(error)\n\n// It works with promises too:\n\nconst value = await Result.fromPromise(() => fetch("/api"));\n// `value` will either be:\n// - Ok(res)\n// - Error(error)\n')),(0,n.kt)("admonition",{title:"Since v3.0.0",type:"tip"},(0,n.kt)("p",{parentName:"admonition"},(0,n.kt)("inlineCode",{parentName:"p"},"Result")," values are referentially equal if they contain the same value, meaning that ",(0,n.kt)("inlineCode",{parentName:"p"},"Result.Ok(1) === Result.Ok(1)")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"Result.Error(1) === Result.Error(1)"),".")),(0,n.kt)("h2",{id:"methods"},"Methods"),(0,n.kt)("p",null,"The result type provides a few manipulation functions:"),(0,n.kt)("h3",{id:"mapf"},".map(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.map(f: (value: A) => B): Result\n")),(0,n.kt)("p",null,"If the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(f(value))"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(error)"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Ok(2).map((x) => x * 2);\n// Result.Ok<4>\n\nResult.Ok(2).map((x) => Result.Ok(x * 2));\n// Result.Ok>\n")),(0,n.kt)("h3",{id:"maperrorf"},".mapError(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.mapError(f: (value: E) => F): Result\n")),(0,n.kt)("p",null,"If the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(error)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(f(error))"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Error(2).mapError((x) => x * 2);\n// Result.Error<4>\n\nResult.Error(2).mapError((x) => Result.Ok(x * 2));\n// Result.Error>\n")),(0,n.kt)("h3",{id:"flatmapf"},".flatMap(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.flatMap(f: (value: A) => Result): Result\n")),(0,n.kt)("p",null,"If the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"f(value)"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(error)"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.Ok(1).flatMap((x) =>\n x > 2 ? Result.Error("some error") : Result.Ok(2),\n);\n// Result.Ok<2>\n\nResult.Ok(3).flatMap((x) =>\n x > 2 ? Result.Error("some error") : Result.Ok(2),\n);\n// Result.Error<"some error">\n\nResult.Error("initial error").flatMap((x) =>\n x > 2 ? Result.Error("some error") : Result.Ok(2),\n);\n// Result.Error<"initial error">\n')),(0,n.kt)("h3",{id:"flatmaperrorf"},".flatMapError(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.flatMapError(f: (value: E) => Result): Result\n")),(0,n.kt)("p",null,"If the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(error)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"f(error)"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.Error(3).flatMapError((x) =>\n x > 2 ? Result.Error("some error") : Result.Ok(2),\n);\n// Result.Error<"some error">\n\nResult.Error(1).flatMapError((x) =>\n x > 2 ? Result.Error("some error") : Result.Ok(2),\n);\n// Result.Ok<2>\n\nResult.Ok("ok").flatMapError((x) =>\n x > 2 ? Result.Error("some error") : Result.Ok(2),\n);\n// Result.Ok<"ok">\n')),(0,n.kt)("h3",{id:"getordefaultvalue"},".getOr(defaultValue)"),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"Alias: ",(0,n.kt)("inlineCode",{parentName:"p"},"getWithDefault"))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.getOr(defaultValue: A): A\n")),(0,n.kt)("p",null,"If the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"value"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"defaultValue"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Ok(2).getOr(1);\n// 2\n\nResult.Error(2).getOr(1);\n// 1\n")),(0,n.kt)("h3",{id:"mapordefaultvalue-mapper"},".mapOr(defaultValue, mapper)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.mapOr(defaultValue: B, mapper: (a: A) => B): B\n")),(0,n.kt)("p",null,"If the option is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"mapper(value)"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"defaultValue"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.Ok(2).mapOr(1, (x) => x * 2);\n// 4\n\nResult.Error("error").mapOr(1, (x) => x * 2);\n// 1\n')),(0,n.kt)("h3",{id:"get"},".get()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.get(): A\n")),(0,n.kt)("p",null,"Returns the value contained in ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)"),". Only usable within a ",(0,n.kt)("inlineCode",{parentName:"p"},"isOk()")," check."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const value = result.get();\n// does not compile\n\nif (result.isOk()) {\n const value = result.get();\n // value\n}\n")),(0,n.kt)("h3",{id:"geterror"},".getError()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.getError(): E\n")),(0,n.kt)("p",null,"Returns the error contained in ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(error)"),". Only usable within a ",(0,n.kt)("inlineCode",{parentName:"p"},"isError()")," check."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const error = result.getError();\n// does not compile\n\nif (result.isError()) {\n const error = result.getError();\n // error\n}\n")),(0,n.kt)("h3",{id:"isok"},".isOk()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.isOk(): boolean\n")),(0,n.kt)("p",null,"Type guard. Checks if the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Ok(2).isOk();\n// true\n\nResult.Error(2).isOk();\n// false\n\nif (result.isOk()) {\n const value = result.get();\n}\n")),(0,n.kt)("h3",{id:"iserror"},".isError()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.isError(): boolean\n")),(0,n.kt)("p",null,"Type guard. Checks if the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(error)")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Ok(2).isError();\n// false\n\nResult.Error().isError();\n// true\n\nif (result.isError()) {\n const value = result.getError();\n}\n")),(0,n.kt)("h3",{id:"tooption"},".toOption()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.toOption(): Option\n")),(0,n.kt)("p",null,"If the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Some(value)"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"None"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Ok(2).toOption();\n// Option.Some<2>\n\nResult.Error(2).toOption();\n// Option.None\n")),(0,n.kt)("h3",{id:"match"},".match()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.match(config: {\n Ok: (value: A) => B;\n Error: (error: E) => B;\n}): B\n")),(0,n.kt)("p",null,"Match the result state"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const valueToDisplay = result.match({\n Ok: (value) => value,\n Error: (error) => {\n console.error(error);\n return "fallback";\n },\n});\n')),(0,n.kt)("h3",{id:"tapfunc"},".tap(func)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.tap(func: (result: Result) => unknown): Result\n")),(0,n.kt)("p",null,"Executes ",(0,n.kt)("inlineCode",{parentName:"p"},"func")," with ",(0,n.kt)("inlineCode",{parentName:"p"},"result"),", and returns ",(0,n.kt)("inlineCode",{parentName:"p"},"result"),". Useful for logging and debugging."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"result.tap(console.log).map((x) => x * 2);\n")),(0,n.kt)("h3",{id:"tapokfunc"},".tapOk(func)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.tapOk(func: (value: A) => unknown): Result\n")),(0,n.kt)("p",null,"Executes ",(0,n.kt)("inlineCode",{parentName:"p"},"func")," with ",(0,n.kt)("inlineCode",{parentName:"p"},"ok"),", and returns ",(0,n.kt)("inlineCode",{parentName:"p"},"result"),". Useful for logging and debugging. No-op if ",(0,n.kt)("inlineCode",{parentName:"p"},"result")," is an error."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"result.tapOk(console.log).map((x) => x * 2);\n")),(0,n.kt)("h3",{id:"taperrorfunc"},".tapError(func)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.tapError(func: (error: E) => unknown): Result\n")),(0,n.kt)("p",null,"Executes ",(0,n.kt)("inlineCode",{parentName:"p"},"func")," with ",(0,n.kt)("inlineCode",{parentName:"p"},"error"),", and returns ",(0,n.kt)("inlineCode",{parentName:"p"},"result"),". Useful for logging and debugging. No-op if ",(0,n.kt)("inlineCode",{parentName:"p"},"result")," is ok."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"result.tapError(console.log).map((x) => x * 2);\n")),(0,n.kt)("h2",{id:"statics"},"Statics"),(0,n.kt)("h3",{id:"resultfrompredicatevalue-predicate-error"},"Result.fromPredicate(value, predicate, error)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"fromPredicate(value: A, f: (value: A) => boolean, errorIfFalse: E): Result\n")),(0,n.kt)("p",null,"Creates an option from a value and a predicate. Will return ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")," if predicate returns ",(0,n.kt)("inlineCode",{parentName:"p"},"true"),", ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(errorIfFalse)")," if ",(0,n.kt)("inlineCode",{parentName:"p"},"false")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.fromPredicate(\n value,\n (value) => value % 2 === 0,\n new Error("Odd number"),\n);\n// Ok if `number` is even, Error if odd\n')),(0,n.kt)("h3",{id:"resultisresultvalue"},"Result.isResult(value)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"isResult(value: unknown): boolean\n")),(0,n.kt)("p",null,"Type guard, checks if the provided value is a result."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.isResult(Result.Ok(1));\n// true\n\nResult.isResult([]);\n// false\n")),(0,n.kt)("h3",{id:"resultallresults"},"Result.all(results)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"all(options: Array>): Result, E>\n")),(0,n.kt)("p",null,'Turns an "array of results of value" into a "result of array of value".'),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.all([Result.Ok(1), Result.Ok(2), Result.Ok(3)]);\n// Result.Ok<[1, 2, 3]>\n\nResult.all([Result.Error("error"), Result.Ok(2), Result.Ok(3)]);\n// Result.Error<"error">\n')),(0,n.kt)("h3",{id:"resultallfromdictresults"},"Result.allFromDict(results)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"allFromDict(options: Dict>): Result, E>\n")),(0,n.kt)("p",null,'Turns a "dict of results of value" into a "result of dict of value".'),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.allFromDict({ a: Result.Ok(1), b: Result.Ok(2), c: Result.Ok(3) });\n// Result.Ok<{a: 1, b: 2, c: 3}>\n\nResult.allFromDict({\n a: Result.Error("error"),\n b: Result.Ok(2),\n c: Result.Ok(3),\n});\n// Result.Error<"error">\n')),(0,n.kt)("h3",{id:"resultfromexecution--value"},"Result.fromExecution(() => value)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"fromExecution(func: () => A) => Result\n")),(0,n.kt)("p",null,"Takes a function returning ",(0,n.kt)("inlineCode",{parentName:"p"},"Value")," that can throw an ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," and returns a ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.fromExecution(() => 1);\n// Result.Ok<1>\n\nResult.fromExecution(() => {\n throw "Something went wrong";\n});\n// Result.Error<"Something went wrong">\n')),(0,n.kt)("h3",{id:"resultfrompromisepromise"},"Result.fromPromise(promise)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"fromPromise(promise: Promise) => Promise>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Promise")," that can fail with ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," and returns a ",(0,n.kt)("inlineCode",{parentName:"p"},"Promise>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"await Result.fromPromise(Promise.resolve(1));\n// Result.Ok<1>\n\nawait Result.fromPromise(Promise.reject(1));\n// Result.Error<1>\n")),(0,n.kt)("h3",{id:"resultfromoptionoption-valueifnone"},"Result.fromOption(option, valueIfNone)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"fromOption(option: Option, valueWhenNone: E): Result\n")),(0,n.kt)("p",null,"Takes a function returning ",(0,n.kt)("inlineCode",{parentName:"p"},"Value")," that can throw an ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," and returns a ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const a = Result.fromOption(Option.Some(1), "NotFound");\n// Result.Ok<1>\n\nconst b = Result.fromOption(Option.None(), "NotFound");\n// Result.Error<"NotFound">\n')),(0,n.kt)("h2",{id:"ts-pattern-interop"},"TS Pattern interop"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},'import { match, P } from "ts-pattern";\nimport { Result } from "@swan-io/boxed";\n\nmatch(myResult)\n .with(Result.P.Ok(P.select()), (value) => console.log(value))\n .with(Result.P.Error(P.select()), (error) => {\n console.error(error);\n return "fallback";\n })\n .exhaustive();\n')),(0,n.kt)("h2",{id:"cheatsheet"},"Cheatsheet"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Method"),(0,n.kt)("th",{parentName:"tr",align:null},"Input"),(0,n.kt)("th",{parentName:"tr",align:null},"Function input"),(0,n.kt)("th",{parentName:"tr",align:null},"Function output"),(0,n.kt)("th",{parentName:"tr",align:null},"Returned value"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapf"},(0,n.kt)("inlineCode",{parentName:"a"},"map"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"y")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapf"},(0,n.kt)("inlineCode",{parentName:"a"},"map"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"f")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmapf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmapf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmapf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)"))))))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ace312b1.9f789a4c.js b/assets/js/ace312b1.9f789a4c.js new file mode 100644 index 00000000..4e91045b --- /dev/null +++ b/assets/js/ace312b1.9f789a4c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[527],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>c});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var p=a.createContext({}),s=function(e){var t=a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",k={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=s(r),d=n,c=m["".concat(p,".").concat(d)]||m[d]||k[d]||l;return r?a.createElement(c,o(o({ref:t},u),{},{components:r})):a.createElement(c,o({ref:t},u))}));function c(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:n,o[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>k,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var a=r(7462),n=(r(7294),r(3905));const l={title:"Result",sidebar_label:"Result"},o=void 0,i={unversionedId:"result",id:"result",title:"Result",description:"The Result can replace exception flows.",source:"@site/docs/result.md",sourceDirName:".",slug:"/result",permalink:"/result",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/result.md",tags:[],version:"current",frontMatter:{title:"Result",sidebar_label:"Result"},sidebar:"docs",previous:{title:"Option",permalink:"/option"},next:{title:"AsyncData",permalink:"/async-data"}},p={},s=[{value:"Create a Result value",id:"create-a-result-value",level:2},{value:"Methods",id:"methods",level:2},{value:".map(f)",id:"mapf",level:3},{value:".mapError(f)",id:"maperrorf",level:3},{value:".flatMap(f)",id:"flatmapf",level:3},{value:".flatMapError(f)",id:"flatmaperrorf",level:3},{value:".getOr(defaultValue)",id:"getordefaultvalue",level:3},{value:".mapOr(defaultValue, mapper)",id:"mapordefaultvalue-mapper",level:3},{value:".get()",id:"get",level:3},{value:".getError()",id:"geterror",level:3},{value:".isOk()",id:"isok",level:3},{value:".isError()",id:"iserror",level:3},{value:".toOption()",id:"tooption",level:3},{value:".match()",id:"match",level:3},{value:".tap(func)",id:"tapfunc",level:3},{value:".tapOk(func)",id:"tapokfunc",level:3},{value:".tapError(func)",id:"taperrorfunc",level:3},{value:"Statics",id:"statics",level:2},{value:"Result.fromPredicate(value, predicate, error)",id:"resultfrompredicatevalue-predicate-error",level:3},{value:"Result.isResult(value)",id:"resultisresultvalue",level:3},{value:"Result.all(results)",id:"resultallresults",level:3},{value:"Result.allFromDict(results)",id:"resultallfromdictresults",level:3},{value:"Result.fromExecution(() => value)",id:"resultfromexecution--value",level:3},{value:"Result.fromPromise(promise)",id:"resultfrompromisepromise",level:3},{value:"Result.fromOption(option, valueIfNone)",id:"resultfromoptionoption-valueifnone",level:3},{value:"TS Pattern interop",id:"ts-pattern-interop",level:2},{value:"Cheatsheet",id:"cheatsheet",level:2}],u={toc:s},m="wrapper";function k(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")," can replace exception flows."),(0,n.kt)("p",null,"Exceptions can be tricky to handle: there's nothing in the type system that tracks if an error has been handled, which is error prone, and adds to your mental overhead. ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")," helps as it ",(0,n.kt)("strong",{parentName:"p"},"makes the value hold the success state"),", making it dead-simple to track with a type-system."),(0,n.kt)("p",null,"Just like the ",(0,n.kt)("inlineCode",{parentName:"p"},"Option")," type, the ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")," type is a box that can have two states:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Ok(value)")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Error(error)"))),(0,n.kt)("h2",{id:"create-a-result-value"},"Create a Result value"),(0,n.kt)("p",null,"To create a result, use the ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," constructors:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},'import { Result } from "@swan-io/boxed";\n\nconst ok = Result.Ok(1);\n\nconst notOk = Result.Error("something happened");\n')),(0,n.kt)("p",null,"You can convert an option to a ",(0,n.kt)("inlineCode",{parentName:"p"},"Result"),":"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},'import { Result, Option } from "@swan-io/boxed";\n\nconst a = Result.fromOption(Option.Some(1), "NotFound");\n// Ok<1>\n\nconst b = Result.fromOption(Option.None(), "NotFound");\n// Error<"NotFound">\n')),(0,n.kt)("p",null,"You get interop with exceptions and promises:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},'// Let\'s say you have some function that throws an error\nconst init = (id: string) => {\n if (id.length !== 24) {\n throw new Error();\n }\n return new Client({ id });\n};\n\nconst result = Result.fromExecution(() => init(id));\n// Here, result will either be:\n// - Ok(client)\n// - Error(error)\n\n// It works with promises too:\n\nconst value = await Result.fromPromise(() => fetch("/api"));\n// `value` will either be:\n// - Ok(res)\n// - Error(error)\n')),(0,n.kt)("admonition",{title:"Since v3.0.0",type:"tip"},(0,n.kt)("p",{parentName:"admonition"},(0,n.kt)("inlineCode",{parentName:"p"},"Result")," values are referentially equal if they contain the same value, meaning that ",(0,n.kt)("inlineCode",{parentName:"p"},"Result.Ok(1) === Result.Ok(1)")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"Result.Error(1) === Result.Error(1)"),".")),(0,n.kt)("h2",{id:"methods"},"Methods"),(0,n.kt)("p",null,"The result type provides a few manipulation functions:"),(0,n.kt)("h3",{id:"mapf"},".map(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.map(f: (value: A) => B): Result\n")),(0,n.kt)("p",null,"If the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(f(value))"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(error)"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Ok(2).map((x) => x * 2);\n// Result.Ok<4>\n\nResult.Ok(2).map((x) => Result.Ok(x * 2));\n// Result.Ok>\n")),(0,n.kt)("h3",{id:"maperrorf"},".mapError(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.mapError(f: (value: E) => F): Result\n")),(0,n.kt)("p",null,"If the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(error)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(f(error))"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Error(2).mapError((x) => x * 2);\n// Result.Error<4>\n\nResult.Error(2).mapError((x) => Result.Ok(x * 2));\n// Result.Error>\n")),(0,n.kt)("h3",{id:"flatmapf"},".flatMap(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.flatMap(f: (value: A) => Result): Result\n")),(0,n.kt)("p",null,"If the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"f(value)"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(error)"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.Ok(1).flatMap((x) =>\n x > 2 ? Result.Error("some error") : Result.Ok(2),\n);\n// Result.Ok<2>\n\nResult.Ok(3).flatMap((x) =>\n x > 2 ? Result.Error("some error") : Result.Ok(2),\n);\n// Result.Error<"some error">\n\nResult.Error("initial error").flatMap((x) =>\n x > 2 ? Result.Error("some error") : Result.Ok(2),\n);\n// Result.Error<"initial error">\n')),(0,n.kt)("h3",{id:"flatmaperrorf"},".flatMapError(f)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.flatMapError(f: (value: E) => Result): Result\n")),(0,n.kt)("p",null,"If the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(error)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"f(error)"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.Error(3).flatMapError((x) =>\n x > 2 ? Result.Error("some error") : Result.Ok(2),\n);\n// Result.Error<"some error">\n\nResult.Error(1).flatMapError((x) =>\n x > 2 ? Result.Error("some error") : Result.Ok(2),\n);\n// Result.Ok<2>\n\nResult.Ok("ok").flatMapError((x) =>\n x > 2 ? Result.Error("some error") : Result.Ok(2),\n);\n// Result.Ok<"ok">\n')),(0,n.kt)("h3",{id:"getordefaultvalue"},".getOr(defaultValue)"),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"Alias: ",(0,n.kt)("inlineCode",{parentName:"p"},"getWithDefault"))),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.getOr(defaultValue: A): A\n")),(0,n.kt)("p",null,"If the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"value"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"defaultValue"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Ok(2).getOr(1);\n// 2\n\nResult.Error(2).getOr(1);\n// 1\n")),(0,n.kt)("h3",{id:"mapordefaultvalue-mapper"},".mapOr(defaultValue, mapper)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.mapOr(defaultValue: B, mapper: (a: A) => B): B\n")),(0,n.kt)("p",null,"If the option is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"mapper(value)"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"defaultValue"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.Ok(2).mapOr(1, (x) => x * 2);\n// 4\n\nResult.Error("error").mapOr(1, (x) => x * 2);\n// 1\n')),(0,n.kt)("h3",{id:"get"},".get()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.get(): A\n")),(0,n.kt)("p",null,"Returns the value contained in ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)"),". Only usable within a ",(0,n.kt)("inlineCode",{parentName:"p"},"isOk()")," check."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const value = result.get();\n// does not compile\n\nif (result.isOk()) {\n const value = result.get();\n // value\n}\n")),(0,n.kt)("h3",{id:"geterror"},".getError()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.getError(): E\n")),(0,n.kt)("p",null,"Returns the error contained in ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(error)"),". Only usable within a ",(0,n.kt)("inlineCode",{parentName:"p"},"isError()")," check."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"const error = result.getError();\n// does not compile\n\nif (result.isError()) {\n const error = result.getError();\n // error\n}\n")),(0,n.kt)("h3",{id:"isok"},".isOk()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.isOk(): boolean\n")),(0,n.kt)("p",null,"Type guard. Checks if the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Ok(2).isOk();\n// true\n\nResult.Error(2).isOk();\n// false\n\nif (result.isOk()) {\n const value = result.get();\n}\n")),(0,n.kt)("h3",{id:"iserror"},".isError()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.isError(): boolean\n")),(0,n.kt)("p",null,"Type guard. Checks if the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(error)")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Ok(2).isError();\n// false\n\nResult.Error().isError();\n// true\n\nif (result.isError()) {\n const value = result.getError();\n}\n")),(0,n.kt)("h3",{id:"tooption"},".toOption()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.toOption(): Option\n")),(0,n.kt)("p",null,"If the result is ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")," returns ",(0,n.kt)("inlineCode",{parentName:"p"},"Some(value)"),", otherwise returns ",(0,n.kt)("inlineCode",{parentName:"p"},"None"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.Ok(2).toOption();\n// Option.Some<2>\n\nResult.Error(2).toOption();\n// Option.None\n")),(0,n.kt)("h3",{id:"match"},".match()"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.match(config: {\n Ok: (value: A) => B;\n Error: (error: E) => B;\n}): B\n")),(0,n.kt)("p",null,"Match the result state"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const valueToDisplay = result.match({\n Ok: (value) => value,\n Error: (error) => {\n console.error(error);\n return "fallback";\n },\n});\n')),(0,n.kt)("h3",{id:"tapfunc"},".tap(func)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.tap(func: (result: Result) => unknown): Result\n")),(0,n.kt)("p",null,"Executes ",(0,n.kt)("inlineCode",{parentName:"p"},"func")," with ",(0,n.kt)("inlineCode",{parentName:"p"},"result"),", and returns ",(0,n.kt)("inlineCode",{parentName:"p"},"result"),". Useful for logging and debugging."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"result.tap(console.log).map((x) => x * 2);\n")),(0,n.kt)("h3",{id:"tapokfunc"},".tapOk(func)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.tapOk(func: (value: A) => unknown): Result\n")),(0,n.kt)("p",null,"Executes ",(0,n.kt)("inlineCode",{parentName:"p"},"func")," with ",(0,n.kt)("inlineCode",{parentName:"p"},"ok"),", and returns ",(0,n.kt)("inlineCode",{parentName:"p"},"result"),". Useful for logging and debugging. No-op if ",(0,n.kt)("inlineCode",{parentName:"p"},"result")," is an error."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"result.tapOk(console.log).map((x) => x * 2);\n")),(0,n.kt)("h3",{id:"taperrorfunc"},".tapError(func)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"Result.tapError(func: (error: E) => unknown): Result\n")),(0,n.kt)("p",null,"Executes ",(0,n.kt)("inlineCode",{parentName:"p"},"func")," with ",(0,n.kt)("inlineCode",{parentName:"p"},"error"),", and returns ",(0,n.kt)("inlineCode",{parentName:"p"},"result"),". Useful for logging and debugging. No-op if ",(0,n.kt)("inlineCode",{parentName:"p"},"result")," is ok."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"result.tapError(console.log).map((x) => x * 2);\n")),(0,n.kt)("h2",{id:"statics"},"Statics"),(0,n.kt)("h3",{id:"resultfrompredicatevalue-predicate-error"},"Result.fromPredicate(value, predicate, error)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"fromPredicate(value: A, f: (value: A) => boolean, errorIfFalse: E): Result\n")),(0,n.kt)("p",null,"Creates an option from a value and a predicate. Will return ",(0,n.kt)("inlineCode",{parentName:"p"},"Ok(value)")," if predicate returns ",(0,n.kt)("inlineCode",{parentName:"p"},"true"),", ",(0,n.kt)("inlineCode",{parentName:"p"},"Error(errorIfFalse)")," if ",(0,n.kt)("inlineCode",{parentName:"p"},"false")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.fromPredicate(\n value,\n (value) => value % 2 === 0,\n new Error("Odd number"),\n);\n// Ok if `number` is even, Error if odd\n')),(0,n.kt)("h3",{id:"resultisresultvalue"},"Result.isResult(value)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"isResult(value: unknown): boolean\n")),(0,n.kt)("p",null,"Type guard, checks if the provided value is a result."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"Result.isResult(Result.Ok(1));\n// true\n\nResult.isResult([]);\n// false\n")),(0,n.kt)("h3",{id:"resultallresults"},"Result.all(results)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"all(options: Array>): Result, E>\n")),(0,n.kt)("p",null,'Turns an "array of results of value" into a "result of array of value".'),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.all([Result.Ok(1), Result.Ok(2), Result.Ok(3)]);\n// Result.Ok<[1, 2, 3]>\n\nResult.all([Result.Error("error"), Result.Ok(2), Result.Ok(3)]);\n// Result.Error<"error">\n')),(0,n.kt)("h3",{id:"resultallfromdictresults"},"Result.allFromDict(results)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"allFromDict(options: Dict>): Result, E>\n")),(0,n.kt)("p",null,'Turns a "dict of results of value" into a "result of dict of value".'),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.allFromDict({ a: Result.Ok(1), b: Result.Ok(2), c: Result.Ok(3) });\n// Result.Ok<{a: 1, b: 2, c: 3}>\n\nResult.allFromDict({\n a: Result.Error("error"),\n b: Result.Ok(2),\n c: Result.Ok(3),\n});\n// Result.Error<"error">\n')),(0,n.kt)("h3",{id:"resultfromexecution--value"},"Result.fromExecution(() => value)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"fromExecution(func: () => A) => Result\n")),(0,n.kt)("p",null,"Takes a function returning ",(0,n.kt)("inlineCode",{parentName:"p"},"Value")," that can throw an ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," and returns a ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'Result.fromExecution(() => 1);\n// Result.Ok<1>\n\nResult.fromExecution(() => {\n throw "Something went wrong";\n});\n// Result.Error<"Something went wrong">\n')),(0,n.kt)("h3",{id:"resultfrompromisepromise"},"Result.fromPromise(promise)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"fromPromise(promise: Promise) => Promise>\n")),(0,n.kt)("p",null,"Takes a ",(0,n.kt)("inlineCode",{parentName:"p"},"Promise")," that can fail with ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," and returns a ",(0,n.kt)("inlineCode",{parentName:"p"},"Promise>")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},"await Result.fromPromise(Promise.resolve(1));\n// Result.Ok<1>\n\nawait Result.fromPromise(Promise.reject(1));\n// Result.Error<1>\n")),(0,n.kt)("h3",{id:"resultfromoptionoption-valueifnone"},"Result.fromOption(option, valueIfNone)"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},"fromOption(option: Option, valueWhenNone: E): Result\n")),(0,n.kt)("p",null,"Takes a function returning ",(0,n.kt)("inlineCode",{parentName:"p"},"Value")," that can throw an ",(0,n.kt)("inlineCode",{parentName:"p"},"Error")," and returns a ",(0,n.kt)("inlineCode",{parentName:"p"},"Result")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts",metastring:'title="Examples"',title:'"Examples"'},'const a = Result.fromOption(Option.Some(1), "NotFound");\n// Result.Ok<1>\n\nconst b = Result.fromOption(Option.None(), "NotFound");\n// Result.Error<"NotFound">\n')),(0,n.kt)("h2",{id:"ts-pattern-interop"},"TS Pattern interop"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-ts"},'import { match, P } from "ts-pattern";\nimport { Result } from "@swan-io/boxed";\n\nmatch(myResult)\n .with(Result.P.Ok(P.select()), (value) => console.log(value))\n .with(Result.P.Error(P.select()), (error) => {\n console.error(error);\n return "fallback";\n })\n .exhaustive();\n')),(0,n.kt)("h2",{id:"cheatsheet"},"Cheatsheet"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"Method"),(0,n.kt)("th",{parentName:"tr",align:null},"Input"),(0,n.kt)("th",{parentName:"tr",align:null},"Function input"),(0,n.kt)("th",{parentName:"tr",align:null},"Function output"),(0,n.kt)("th",{parentName:"tr",align:null},"Returned value"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapf"},(0,n.kt)("inlineCode",{parentName:"a"},"map"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"y")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#mapf"},(0,n.kt)("inlineCode",{parentName:"a"},"map"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#maperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"mapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"f")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmapf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmapf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"x")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmapf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMap"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not provided")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("em",{parentName:"td"},"not executed")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(x)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Ok(y)"))),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"#flatmaperrorf"},(0,n.kt)("inlineCode",{parentName:"a"},"flatMapError"))),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(e)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"e")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)")),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("inlineCode",{parentName:"td"},"Error(f)"))))))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c92590cf.a57b48aa.js b/assets/js/c92590cf.33482390.js similarity index 56% rename from assets/js/c92590cf.a57b48aa.js rename to assets/js/c92590cf.33482390.js index fd9bcac4..d665c606 100644 --- a/assets/js/c92590cf.a57b48aa.js +++ b/assets/js/c92590cf.33482390.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[247],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),s=p(r),y=a,d=s["".concat(u,".").concat(y)]||s[y]||m[y]||o;return r?n.createElement(d,i(i({ref:t},c),{},{components:r})):n.createElement(d,i({ref:t},c))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=y;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={title:"Retry",sidebar_label:"Retry"},i=void 0,l={unversionedId:"retry",id:"retry",title:"Retry",description:"When some operations can fail, you might want to implement a retry logic.",source:"@site/docs/retry.md",sourceDirName:".",slug:"/retry",permalink:"/boxed/retry",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/retry.md",tags:[],version:"current",frontMatter:{title:"Retry",sidebar_label:"Retry"},sidebar:"docs",previous:{title:"Cancellable Request",permalink:"/boxed/cancellable-request"},next:{title:"Concurrency",permalink:"/boxed/concurrency"}},u={},p=[{value:"Retry with maximum attempts",id:"retry-with-maximum-attempts",level:2},{value:"Rety with delay",id:"rety-with-delay",level:2}],c={toc:p},s="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"When some operations can fail, you might want to implement a retry logic."),(0,a.kt)("h2",{id:"retry-with-maximum-attempts"},"Retry with maximum attempts"),(0,a.kt)("p",null,"If ",(0,a.kt)("inlineCode",{parentName:"p"},"getUserById")," outputs a ",(0,a.kt)("inlineCode",{parentName:"p"},"Result.Ok")," value, the future resolves, if it outputs a ",(0,a.kt)("inlineCode",{parentName:"p"},"Result.Error"),", it re-executes ",(0,a.kt)("inlineCode",{parentName:"p"},"getUserById"),"."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"// retry immediately after failure\nFuture.retry(() => getUserById(userId), { max: 3 });\n// Future>\n")),(0,a.kt)("h2",{id:"rety-with-delay"},"Rety with delay"),(0,a.kt)("p",null,"The function you pass ",(0,a.kt)("inlineCode",{parentName:"p"},"Future.retry")," takes an ",(0,a.kt)("inlineCode",{parentName:"p"},"attempt")," parameter, which is the current number of attempts. The count starts at ",(0,a.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"// adding delay\nFuture.retry(\n (attempt) => {\n return Future.wait(attempt * 100).flatMap(() => getUserById(userId));\n },\n { max: 10 },\n);\n// Future>\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[247],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},y=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),s=p(r),y=a,d=s["".concat(u,".").concat(y)]||s[y]||m[y]||o;return r?n.createElement(d,i(i({ref:t},c),{},{components:r})):n.createElement(d,i({ref:t},c))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=y;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[s]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={title:"Retry",sidebar_label:"Retry"},i=void 0,l={unversionedId:"retry",id:"retry",title:"Retry",description:"When some operations can fail, you might want to implement a retry logic.",source:"@site/docs/retry.md",sourceDirName:".",slug:"/retry",permalink:"/retry",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/retry.md",tags:[],version:"current",frontMatter:{title:"Retry",sidebar_label:"Retry"},sidebar:"docs",previous:{title:"Cancellable Request",permalink:"/cancellable-request"},next:{title:"Concurrency",permalink:"/concurrency"}},u={},p=[{value:"Retry with maximum attempts",id:"retry-with-maximum-attempts",level:2},{value:"Rety with delay",id:"rety-with-delay",level:2}],c={toc:p},s="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"When some operations can fail, you might want to implement a retry logic."),(0,a.kt)("h2",{id:"retry-with-maximum-attempts"},"Retry with maximum attempts"),(0,a.kt)("p",null,"If ",(0,a.kt)("inlineCode",{parentName:"p"},"getUserById")," outputs a ",(0,a.kt)("inlineCode",{parentName:"p"},"Result.Ok")," value, the future resolves, if it outputs a ",(0,a.kt)("inlineCode",{parentName:"p"},"Result.Error"),", it re-executes ",(0,a.kt)("inlineCode",{parentName:"p"},"getUserById"),"."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"// retry immediately after failure\nFuture.retry(() => getUserById(userId), { max: 3 });\n// Future>\n")),(0,a.kt)("h2",{id:"rety-with-delay"},"Rety with delay"),(0,a.kt)("p",null,"The function you pass ",(0,a.kt)("inlineCode",{parentName:"p"},"Future.retry")," takes an ",(0,a.kt)("inlineCode",{parentName:"p"},"attempt")," parameter, which is the current number of attempts. The count starts at ",(0,a.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"// adding delay\nFuture.retry(\n (attempt) => {\n return Future.wait(attempt * 100).flatMap(() => getUserById(userId));\n },\n { max: 10 },\n);\n// Future>\n")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d589d3a7.e6f49f4f.js b/assets/js/d589d3a7.0e182503.js similarity index 50% rename from assets/js/d589d3a7.e6f49f4f.js rename to assets/js/d589d3a7.0e182503.js index 37a80c1a..994d6170 100644 --- a/assets/js/d589d3a7.e6f49f4f.js +++ b/assets/js/d589d3a7.0e182503.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[162],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),p=c(n),g=o,m=p["".concat(l,".").concat(g)]||p[g]||u[g]||a;return n?r.createElement(m,s(s({ref:t},d),{},{components:n})):r.createElement(m,s({ref:t},d))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=g;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:o,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(7462),o=(n(7294),n(3905));const a={title:"Getting started",sidebar_label:"Getting started"},s="Getting started",i={unversionedId:"getting-started",id:"getting-started",title:"Getting started",description:"Boxed provides essential building-blocks to solve common issues you can run into in your application or library development.",source:"@site/docs/getting-started.md",sourceDirName:".",slug:"/getting-started",permalink:"/boxed/getting-started",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/getting-started.md",tags:[],version:"current",frontMatter:{title:"Getting started",sidebar_label:"Getting started"},sidebar:"docs",next:{title:"Core Concepts",permalink:"/boxed/core-concepts"}},l={},c=[{value:"What does Boxed solve?",id:"what-does-boxed-solve",level:2},{value:"How does Boxed solve these bugs?",id:"how-does-boxed-solve-these-bugs",level:2}],d={toc:c},p="wrapper";function u(e){let{components:t,...a}=e;return(0,o.kt)(p,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"getting-started"},"Getting started"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Boxed")," provides essential building-blocks to solve common issues you can run into in your application or library development."),(0,o.kt)("h2",{id:"what-does-boxed-solve"},"What does Boxed solve?"),(0,o.kt)("p",null,"Virtually any application has to deal with the following states:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"optionality")," (a value being there or not)"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"success")," (a value that can be computed or fails to be)"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"completion")," (a value that is available or not)")),(0,o.kt)("p",null,"If we use the default way JavaScript (and by extension TypeScript) provides to handle these, we generally end up with code that's growing more complex over time, and introduce ",(0,o.kt)("em",{parentName:"p"},"subtle")," bugs:"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"A subtle bug",src:n(2037).Z,width:"1480",height:"826"})),(0,o.kt)("h2",{id:"how-does-boxed-solve-these-bugs"},"How does Boxed solve these bugs?"),(0,o.kt)("p",null,"Boxed provides useful data-structures designed in way that ",(0,o.kt)("strong",{parentName:"p"},"completely eliminates these issues")," using properties from maths\u2122 (don't worry, you don't need to know the full theory, you can just enjoy the benefits it provides)."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Monads & functors",src:n(4765).Z,width:"1700",height:"946"})),(0,o.kt)("p",null,"Now, let's get into the details with the ",(0,o.kt)("a",{parentName:"p",href:"/boxed/core-concepts"},"core concepts"),"."))}u.isMDXComponent=!0},4765:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/monads-functors-a96bc609277b625923dc05cf138762d9.png"},2037:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/successful-error-3d4987ce56f6808fa91dbf23542093c5.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[162],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),p=c(n),g=o,m=p["".concat(l,".").concat(g)]||p[g]||u[g]||a;return n?r.createElement(m,s(s({ref:t},d),{},{components:n})):r.createElement(m,s({ref:t},d))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=g;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[p]="string"==typeof e?e:o,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(7462),o=(n(7294),n(3905));const a={title:"Getting started",sidebar_label:"Getting started"},s="Getting started",i={unversionedId:"getting-started",id:"getting-started",title:"Getting started",description:"Boxed provides essential building-blocks to solve common issues you can run into in your application or library development.",source:"@site/docs/getting-started.md",sourceDirName:".",slug:"/getting-started",permalink:"/getting-started",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/getting-started.md",tags:[],version:"current",frontMatter:{title:"Getting started",sidebar_label:"Getting started"},sidebar:"docs",next:{title:"Core Concepts",permalink:"/core-concepts"}},l={},c=[{value:"What does Boxed solve?",id:"what-does-boxed-solve",level:2},{value:"How does Boxed solve these bugs?",id:"how-does-boxed-solve-these-bugs",level:2}],d={toc:c},p="wrapper";function u(e){let{components:t,...a}=e;return(0,o.kt)(p,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"getting-started"},"Getting started"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Boxed")," provides essential building-blocks to solve common issues you can run into in your application or library development."),(0,o.kt)("h2",{id:"what-does-boxed-solve"},"What does Boxed solve?"),(0,o.kt)("p",null,"Virtually any application has to deal with the following states:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"optionality")," (a value being there or not)"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"success")," (a value that can be computed or fails to be)"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"completion")," (a value that is available or not)")),(0,o.kt)("p",null,"If we use the default way JavaScript (and by extension TypeScript) provides to handle these, we generally end up with code that's growing more complex over time, and introduce ",(0,o.kt)("em",{parentName:"p"},"subtle")," bugs:"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"A subtle bug",src:n(2037).Z,width:"1480",height:"826"})),(0,o.kt)("h2",{id:"how-does-boxed-solve-these-bugs"},"How does Boxed solve these bugs?"),(0,o.kt)("p",null,"Boxed provides useful data-structures designed in way that ",(0,o.kt)("strong",{parentName:"p"},"completely eliminates these issues")," using properties from maths\u2122 (don't worry, you don't need to know the full theory, you can just enjoy the benefits it provides)."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Monads & functors",src:n(4765).Z,width:"1700",height:"946"})),(0,o.kt)("p",null,"Now, let's get into the details with the ",(0,o.kt)("a",{parentName:"p",href:"/core-concepts"},"core concepts"),"."))}u.isMDXComponent=!0},4765:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/monads-functors-a96bc609277b625923dc05cf138762d9.png"},2037:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/successful-error-3d4987ce56f6808fa91dbf23542093c5.png"}}]); \ No newline at end of file diff --git a/assets/js/d8fa0e62.fdc8a617.js b/assets/js/d8fa0e62.fdc8a617.js deleted file mode 100644 index 63f1dacb..00000000 --- a/assets/js/d8fa0e62.fdc8a617.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[241],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>g});var r=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(n),m=i,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:i,o[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var r=n(7462),i=(n(7294),n(3905));const a={title:"Design choices",sidebar_label:"Design choices"},o=void 0,l={unversionedId:"design-choices",id:"design-choices",title:"Design choices",description:"Chaining API",source:"@site/docs/design-choices.md",sourceDirName:".",slug:"/design-choices",permalink:"/boxed/design-choices",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/design-choices.md",tags:[],version:"current",frontMatter:{title:"Design choices",sidebar_label:"Design choices"},sidebar:"docs",previous:{title:"Installation",permalink:"/boxed/installation"},next:{title:"Option",permalink:"/boxed/option"}},s={},c=[{value:"Chaining API",id:"chaining-api",level:2},{value:"Eager over lazy",id:"eager-over-lazy",level:2},{value:"Naming",id:"naming",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"chaining-api"},"Chaining API"),(0,i.kt)("p",null,"Most functional programming libraries in JavaScript provide a data-last API (",(0,i.kt)("inlineCode",{parentName:"p"},"map(func)(value)"),") along with a ",(0,i.kt)("inlineCode",{parentName:"p"},"pipe")," function to chain operations."),(0,i.kt)("p",null,"While this approach works well in languages that include some kind of native pipe operator, we consider that it doesn't provide a good enough developer experience in your TypeScript code editor: it makes it tedious to inspect a value in a ",(0,i.kt)("inlineCode",{parentName:"p"},"pipe")," chain and doesn't provide autocomplete natively."),(0,i.kt)("p",null,"For this reason, we decided to use good ol'chaining, reducing the number of imports, making your code more expressive, easier to read and inspect."),(0,i.kt)("h2",{id:"eager-over-lazy"},"Eager over lazy"),(0,i.kt)("p",null,"More often than not, these functional programming libraries use lazy initialisation, meaning your code won't execute until you tell it to explicitely (e.g. with a ",(0,i.kt)("inlineCode",{parentName:"p"},"run")," call at the end)."),(0,i.kt)("p",null,"In the vast majority of cases we've seen, this is not something that's wanted. For the few cases where laziness is wanted, making a function that returns the data-structure or using a ",(0,i.kt)("inlineCode",{parentName:"p"},"Deferred")," does the job pretty well."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts"},"const eagerFuture = Future.make((resolve) => resolve(1));\n\nconst lazyFuture = () => Future.make((resolve) => resolve(1));\n\nconst [deferred, resolve] = Deferred.make();\n")),(0,i.kt)("h2",{id:"naming"},"Naming"),(0,i.kt)("p",null,"Rather than using naming from abstract theory, if a concept exists in JavaScript built-ins, Boxed will provide similar naming (e.g. we provide ",(0,i.kt)("inlineCode",{parentName:"p"},"Future.all")," to mimic ",(0,i.kt)("inlineCode",{parentName:"p"},"Promise.all")," rather than ",(0,i.kt)("inlineCode",{parentName:"p"},"Future.sequenceArray"),")."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d8fa0e62.fe0cfc7b.js b/assets/js/d8fa0e62.fe0cfc7b.js new file mode 100644 index 00000000..0e07c9c8 --- /dev/null +++ b/assets/js/d8fa0e62.fe0cfc7b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[241],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>g});var r=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(n),m=i,g=u["".concat(s,".").concat(m)]||u[m]||d[m]||a;return n?r.createElement(g,o(o({ref:t},p),{},{components:n})):r.createElement(g,o({ref:t},p))}));function g(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:i,o[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var r=n(7462),i=(n(7294),n(3905));const a={title:"Design choices",sidebar_label:"Design choices"},o=void 0,l={unversionedId:"design-choices",id:"design-choices",title:"Design choices",description:"Chaining API",source:"@site/docs/design-choices.md",sourceDirName:".",slug:"/design-choices",permalink:"/design-choices",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/design-choices.md",tags:[],version:"current",frontMatter:{title:"Design choices",sidebar_label:"Design choices"},sidebar:"docs",previous:{title:"Installation",permalink:"/installation"},next:{title:"Option",permalink:"/option"}},s={},c=[{value:"Chaining API",id:"chaining-api",level:2},{value:"Eager over lazy",id:"eager-over-lazy",level:2},{value:"Naming",id:"naming",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"chaining-api"},"Chaining API"),(0,i.kt)("p",null,"Most functional programming libraries in JavaScript provide a data-last API (",(0,i.kt)("inlineCode",{parentName:"p"},"map(func)(value)"),") along with a ",(0,i.kt)("inlineCode",{parentName:"p"},"pipe")," function to chain operations."),(0,i.kt)("p",null,"While this approach works well in languages that include some kind of native pipe operator, we consider that it doesn't provide a good enough developer experience in your TypeScript code editor: it makes it tedious to inspect a value in a ",(0,i.kt)("inlineCode",{parentName:"p"},"pipe")," chain and doesn't provide autocomplete natively."),(0,i.kt)("p",null,"For this reason, we decided to use good ol'chaining, reducing the number of imports, making your code more expressive, easier to read and inspect."),(0,i.kt)("h2",{id:"eager-over-lazy"},"Eager over lazy"),(0,i.kt)("p",null,"More often than not, these functional programming libraries use lazy initialisation, meaning your code won't execute until you tell it to explicitely (e.g. with a ",(0,i.kt)("inlineCode",{parentName:"p"},"run")," call at the end)."),(0,i.kt)("p",null,"In the vast majority of cases we've seen, this is not something that's wanted. For the few cases where laziness is wanted, making a function that returns the data-structure or using a ",(0,i.kt)("inlineCode",{parentName:"p"},"Deferred")," does the job pretty well."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ts"},"const eagerFuture = Future.make((resolve) => resolve(1));\n\nconst lazyFuture = () => Future.make((resolve) => resolve(1));\n\nconst [deferred, resolve] = Deferred.make();\n")),(0,i.kt)("h2",{id:"naming"},"Naming"),(0,i.kt)("p",null,"Rather than using naming from abstract theory, if a concept exists in JavaScript built-ins, Boxed will provide similar naming (e.g. we provide ",(0,i.kt)("inlineCode",{parentName:"p"},"Future.all")," to mimic ",(0,i.kt)("inlineCode",{parentName:"p"},"Promise.all")," rather than ",(0,i.kt)("inlineCode",{parentName:"p"},"Future.sequenceArray"),")."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e9c55326.bf7580ff.js b/assets/js/e9c55326.572e0f30.js similarity index 72% rename from assets/js/e9c55326.bf7580ff.js rename to assets/js/e9c55326.572e0f30.js index 0e717bb2..70247efb 100644 --- a/assets/js/e9c55326.bf7580ff.js +++ b/assets/js/e9c55326.572e0f30.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[315],{3905:(e,r,t)=>{t.d(r,{Zo:()=>u,kt:()=>m});var n=t(7294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function l(e){for(var r=1;r=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var c=n.createContext({}),s=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):l(l({},r),e)),t},u=function(e){var r=s(e.components);return n.createElement(c.Provider,{value:r},e.children)},d="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},p=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=s(t),p=o,m=d["".concat(c,".").concat(p)]||d[p]||f[p]||a;return t?n.createElement(m,l(l({ref:r},u),{},{components:t})):n.createElement(m,l({ref:r},u))}));function m(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var a=t.length,l=new Array(a);l[0]=p;var i={};for(var c in r)hasOwnProperty.call(r,c)&&(i[c]=r[c]);i.originalType=e,i[d]="string"==typeof e?e:o,l[1]=i;for(var s=2;s{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>l,default:()=>f,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=t(7462),o=(t(7294),t(3905));const a={title:"Deferred",sidebar_label:"Deferred"},l=void 0,i={unversionedId:"deferred",id:"deferred",title:"Deferred",description:"Deferred.make()",source:"@site/docs/deferred.md",sourceDirName:".",slug:"/deferred",permalink:"/boxed/deferred",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/deferred.md",tags:[],version:"current",frontMatter:{title:"Deferred",sidebar_label:"Deferred"},sidebar:"docs",previous:{title:"Future helpers",permalink:"/boxed/future-result"},next:{title:"Array",permalink:"/boxed/array"}},c={},s=[{value:"Deferred.make()",id:"deferredmake",level:2}],u={toc:s},d="wrapper";function f(e){let{components:r,...t}=e;return(0,o.kt)(d,(0,n.Z)({},u,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"deferredmake"},"Deferred.make()"),(0,o.kt)("p",null,"Returns a future and its resolver:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'import { Deferred } from "@swan-io/boxed";\n\nconst [future, resolve] = Deferred.make();\n\n// subscribe to the promise\nfuture.onResolve(console.log);\n\n// resolve from elsewhere\nresolve("Hello!");\n')))}f.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[315],{3905:(e,r,t)=>{t.d(r,{Zo:()=>u,kt:()=>m});var n=t(7294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function l(e){for(var r=1;r=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var c=n.createContext({}),s=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):l(l({},r),e)),t},u=function(e){var r=s(e.components);return n.createElement(c.Provider,{value:r},e.children)},d="mdxType",f={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},p=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=s(t),p=o,m=d["".concat(c,".").concat(p)]||d[p]||f[p]||a;return t?n.createElement(m,l(l({ref:r},u),{},{components:t})):n.createElement(m,l({ref:r},u))}));function m(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var a=t.length,l=new Array(a);l[0]=p;var i={};for(var c in r)hasOwnProperty.call(r,c)&&(i[c]=r[c]);i.originalType=e,i[d]="string"==typeof e?e:o,l[1]=i;for(var s=2;s{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>l,default:()=>f,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var n=t(7462),o=(t(7294),t(3905));const a={title:"Deferred",sidebar_label:"Deferred"},l=void 0,i={unversionedId:"deferred",id:"deferred",title:"Deferred",description:"Deferred.make()",source:"@site/docs/deferred.md",sourceDirName:".",slug:"/deferred",permalink:"/deferred",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/deferred.md",tags:[],version:"current",frontMatter:{title:"Deferred",sidebar_label:"Deferred"},sidebar:"docs",previous:{title:"Future helpers",permalink:"/future-result"},next:{title:"Array",permalink:"/array"}},c={},s=[{value:"Deferred.make()",id:"deferredmake",level:2}],u={toc:s},d="wrapper";function f(e){let{components:r,...t}=e;return(0,o.kt)(d,(0,n.Z)({},u,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"deferredmake"},"Deferred.make()"),(0,o.kt)("p",null,"Returns a future and its resolver:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'import { Deferred } from "@swan-io/boxed";\n\nconst [future, resolve] = Deferred.make();\n\n// subscribe to the promise\nfuture.onResolve(console.log);\n\n// resolve from elsewhere\nresolve("Hello!");\n')))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f38b294d.1111032d.js b/assets/js/f38b294d.27292acc.js similarity index 54% rename from assets/js/f38b294d.1111032d.js rename to assets/js/f38b294d.27292acc.js index 135c61a6..9f179de6 100644 --- a/assets/js/f38b294d.1111032d.js +++ b/assets/js/f38b294d.27292acc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[235],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>y});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=c(r),m=a,y=d["".concat(p,".").concat(m)]||d[m]||u[m]||i;return r?n.createElement(y,o(o({ref:t},s),{},{components:r})):n.createElement(y,o({ref:t},s))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:a,o[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const i={title:"Serializer",sidebar_label:"Serializer"},o=void 0,l={unversionedId:"serializer",id:"serializer",title:"Serializer",description:"The serializer enables you to serialize some Boxed values (e.g. to store in LocalStorage, or to hydrate data from SSR).",source:"@site/docs/serializer.md",sourceDirName:".",slug:"/serializer",permalink:"/boxed/serializer",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/serializer.md",tags:[],version:"current",frontMatter:{title:"Serializer",sidebar_label:"Serializer"},sidebar:"docs",previous:{title:"Lazy",permalink:"/boxed/lazy"},next:{title:"React Request",permalink:"/boxed/react-request"}},p={},c=[{value:"Serializer.encode(value)",id:"serializerencodevalue",level:2},{value:"Serializer.decode(value)",id:"serializerdecodevalue",level:2}],s={toc:c},d="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The serializer enables you to serialize some Boxed values (e.g. to store in ",(0,a.kt)("inlineCode",{parentName:"p"},"LocalStorage"),", or to hydrate data from SSR)."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'import { Serializer } from "@swan-io/boxed";\n')),(0,a.kt)("h2",{id:"serializerencodevalue"},"Serializer.encode(value)"),(0,a.kt)("p",null,"Stringifies the input to JSON, managing the ",(0,a.kt)("inlineCode",{parentName:"p"},"AsyncData"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"Option")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"Result")," types properly."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'Serializer.encode({\n data: AsyncData.Done({\n name: Option.None(),\n }),\n});\n// {"data":{"__boxed_type__":"AsyncData","tag":"Done","value":{"name":{"__boxed_type__":"Option","tag":"None"}}}}\n')),(0,a.kt)("h2",{id:"serializerdecodevalue"},"Serializer.decode(value)"),(0,a.kt)("p",null,"Parse the JSON input, reviving the ",(0,a.kt)("inlineCode",{parentName:"p"},"AsyncData"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"Option")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"Result")," types properly."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'Serializer.decode(`{"__boxed_type__":"Option","tag":"None"}`); // Option.None();\n')))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[235],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>y});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(r),m=a,y=u["".concat(p,".").concat(m)]||u[m]||d[m]||i;return r?n.createElement(y,o(o({ref:t},s),{},{components:r})):n.createElement(y,o({ref:t},s))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:a,o[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const i={title:"Serializer",sidebar_label:"Serializer"},o=void 0,l={unversionedId:"serializer",id:"serializer",title:"Serializer",description:"The serializer enables you to serialize some Boxed values (e.g. to store in LocalStorage, or to hydrate data from SSR).",source:"@site/docs/serializer.md",sourceDirName:".",slug:"/serializer",permalink:"/serializer",draft:!1,editUrl:"https://github.com/swan-io/boxed/edit/main/docs/docs/serializer.md",tags:[],version:"current",frontMatter:{title:"Serializer",sidebar_label:"Serializer"},sidebar:"docs",previous:{title:"Lazy",permalink:"/lazy"},next:{title:"React Request",permalink:"/react-request"}},p={},c=[{value:"Serializer.encode(value)",id:"serializerencodevalue",level:2},{value:"Serializer.decode(value)",id:"serializerdecodevalue",level:2}],s={toc:c},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The serializer enables you to serialize some Boxed values (e.g. to store in ",(0,a.kt)("inlineCode",{parentName:"p"},"LocalStorage"),", or to hydrate data from SSR)."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'import { Serializer } from "@swan-io/boxed";\n')),(0,a.kt)("h2",{id:"serializerencodevalue"},"Serializer.encode(value)"),(0,a.kt)("p",null,"Stringifies the input to JSON, managing the ",(0,a.kt)("inlineCode",{parentName:"p"},"AsyncData"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"Option")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"Result")," types properly."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'Serializer.encode({\n data: AsyncData.Done({\n name: Option.None(),\n }),\n});\n// {"data":{"__boxed_type__":"AsyncData","tag":"Done","value":{"name":{"__boxed_type__":"Option","tag":"None"}}}}\n')),(0,a.kt)("h2",{id:"serializerdecodevalue"},"Serializer.decode(value)"),(0,a.kt)("p",null,"Parse the JSON input, reviving the ",(0,a.kt)("inlineCode",{parentName:"p"},"AsyncData"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"Option")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"Result")," types properly."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'Serializer.decode(`{"__boxed_type__":"Option","tag":"None"}`); // Option.None();\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.153b1e42.js b/assets/js/main.153b1e42.js new file mode 100644 index 00000000..15a52b75 --- /dev/null +++ b/assets/js/main.153b1e42.js @@ -0,0 +1,2 @@ +/*! For license information please see main.153b1e42.js.LICENSE.txt */ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(7294);function a(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"168e900d":[()=>n.e(78).then(n.t.bind(n,3769,19)),"/home/runner/work/boxed/boxed/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],17896441:[()=>Promise.all([n.e(532),n.e(814),n.e(918)]).then(n.bind(n,5836)),"@theme/DocItem",5836],"1a4e3797":[()=>Promise.all([n.e(532),n.e(920)]).then(n.bind(n,6675)),"@theme/SearchPage",6675],"1be78505":[()=>Promise.all([n.e(532),n.e(514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1d90b0b1":[()=>n.e(271).then(n.t.bind(n,7085,19)),"/home/runner/work/boxed/boxed/docs/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],"23d1b9e9":[()=>n.e(382).then(n.bind(n,5851)),"@site/docs/concurrency.md",5851],"28b9547a":[()=>n.e(498).then(n.bind(n,8250)),"@site/docs/future-result.md",8250],"3b8c55ea":[()=>n.e(217).then(n.bind(n,9250)),"@site/docs/installation.md",9250],"3d955d88":[()=>n.e(245).then(n.bind(n,9360)),"@site/docs/cancellable-request.md",9360],"414a3798":[()=>n.e(960).then(n.bind(n,3219)),"@site/docs/react-request.md",3219],"43cd4838":[()=>n.e(658).then(n.bind(n,7035)),"@site/docs/core-concepts.md",7035],"44ef08bc":[()=>n.e(61).then(n.bind(n,8635)),"@site/docs/form-validation.md",8635],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"600fab28":[()=>n.e(437).then(n.bind(n,2496)),"@site/docs/dict.md",2496],"618f8fb4":[()=>n.e(476).then(n.bind(n,6110)),"@site/docs/option.md",6110],"75a55335":[()=>n.e(109).then(n.bind(n,2250)),"@site/docs/nested-optional-values.md",2250],"7958baa0":[()=>n.e(571).then(n.bind(n,1890)),"@site/docs/lazy.md",1890],"927d9381":[()=>n.e(620).then(n.bind(n,5423)),"@site/docs/array.md",5423],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"974039d5":[()=>n.e(385).then(n.bind(n,5027)),"@site/docs/async-data.md",5027],"977fb8cd":[()=>n.e(20).then(n.bind(n,6955)),"@site/docs/future.md",6955],"984db706":[()=>n.e(675).then(n.bind(n,1296)),"@site/docs/async-data-result.md",1296],a7da88a7:[()=>n.e(611).then(n.bind(n,240)),"@site/docs/inspirations.md",240],ace312b1:[()=>n.e(527).then(n.bind(n,7598)),"@site/docs/result.md",7598],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(814),n.e(195)]).then(n.bind(n,3261)),"@site/src/pages/index.js",3261],c92590cf:[()=>n.e(247).then(n.bind(n,2656)),"@site/docs/retry.md",2656],d589d3a7:[()=>n.e(162).then(n.bind(n,9390)),"@site/docs/getting-started.md",9390],d5efc89d:[()=>n.e(887).then(n.t.bind(n,5745,19)),"/home/runner/work/boxed/boxed/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],d8fa0e62:[()=>n.e(241).then(n.bind(n,6770)),"@site/docs/design-choices.md",6770],e9c55326:[()=>n.e(315).then(n.bind(n,9162)),"@site/docs/deferred.md",9162],f38b294d:[()=>n.e(235).then(n.bind(n,1040)),"@site/docs/serializer.md",1040]};function u(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],m=[],h=(0,c.Z)(o);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/search",component:f("/search","285"),exact:!0},{path:"/",component:f("/","492"),exact:!0},{path:"/",component:f("/","ceb"),routes:[{path:"/array",component:f("/array","303"),exact:!0,sidebar:"docs"},{path:"/async-data",component:f("/async-data","e1c"),exact:!0,sidebar:"docs"},{path:"/async-data-result",component:f("/async-data-result","f7d"),exact:!0,sidebar:"docs"},{path:"/cancellable-request",component:f("/cancellable-request","64a"),exact:!0,sidebar:"docs"},{path:"/concurrency",component:f("/concurrency","726"),exact:!0,sidebar:"docs"},{path:"/core-concepts",component:f("/core-concepts","460"),exact:!0,sidebar:"docs"},{path:"/deferred",component:f("/deferred","d21"),exact:!0,sidebar:"docs"},{path:"/design-choices",component:f("/design-choices","4a6"),exact:!0,sidebar:"docs"},{path:"/dict",component:f("/dict","647"),exact:!0,sidebar:"docs"},{path:"/form-validation",component:f("/form-validation","787"),exact:!0,sidebar:"docs"},{path:"/future",component:f("/future","045"),exact:!0,sidebar:"docs"},{path:"/future-result",component:f("/future-result","add"),exact:!0,sidebar:"docs"},{path:"/getting-started",component:f("/getting-started","7d1"),exact:!0,sidebar:"docs"},{path:"/inspirations",component:f("/inspirations","d81"),exact:!0,sidebar:"docs"},{path:"/installation",component:f("/installation","d10"),exact:!0,sidebar:"docs"},{path:"/lazy",component:f("/lazy","e00"),exact:!0,sidebar:"docs"},{path:"/nested-optional-values",component:f("/nested-optional-values","7af"),exact:!0,sidebar:"docs"},{path:"/option",component:f("/option","c47"),exact:!0,sidebar:"docs"},{path:"/react-request",component:f("/react-request","282"),exact:!0,sidebar:"docs"},{path:"/result",component:f("/result","355"),exact:!0,sidebar:"docs"},{path:"/retry",component:f("/retry","2ca"),exact:!0,sidebar:"docs"},{path:"/serializer",component:f("/serializer","719"),exact:!0,sidebar:"docs"}]},{path:"*",component:f("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),c=n(6550),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(5742),h=n(2263),g=n(4996),v=n(6668),b=n(833),y=n(4711),w=n(9727),k=n(3320),E=n(197);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),a=function(){const{siteConfig:{url:e}}=(0,h.Z)(),{pathname:t}=(0,c.TH)();return e+(0,g.Z)(t)}(),o=t?`${n}${t}`:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function C(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,v.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(b.d,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(E.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const T=new Map;function _(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var A=n(8934),L=n(8940);function R(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:a}),R("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function P(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?R("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=R("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(N,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const I=O,D="docusaurus-base-url-issue-banner-container",M="docusaurus-base-url-issue-banner",F="docusaurus-base-url-issue-banner-suggestion-container",B="__DOCUSAURUS_INSERT_BASEURL_BANNER";function j(e){return`\nwindow['${B}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${B}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${D}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{window[B]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,j(e))),r.createElement("div",{id:D}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(z,null):null}function $(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,h.Z)(),i=(0,g.Z)(e),{htmlLang:l,direction:s}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:l,dir:s}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var q=n(4763);function H(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(q.Z,null,r.createElement(L.M,null,r.createElement(A.t,null,r.createElement(f,null,r.createElement($,null),r.createElement(C,null),r.createElement(U,null),r.createElement(I,{location:_(t)},e)))))}var G=n(6887);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var V=n(9670);const W=new Set,K=new Set,Y=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,Q={prefetch(e){if(!(e=>!Y()&&!K.has(e)&&!W.has(e))(e))return!1;W.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,V.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!Y()&&!K.has(e))(e)&&(K.add(e),P(e))},X=Object.freeze(Q);if(l.Z.canUseDOM){window.docusaurus=X;const e=a.hydrate;P(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(H,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"getting-started","docs":[{"id":"array","path":"/array","sidebar":"docs"},{"id":"async-data","path":"/async-data","sidebar":"docs"},{"id":"async-data-result","path":"/async-data-result","sidebar":"docs"},{"id":"cancellable-request","path":"/cancellable-request","sidebar":"docs"},{"id":"concurrency","path":"/concurrency","sidebar":"docs"},{"id":"core-concepts","path":"/core-concepts","sidebar":"docs"},{"id":"deferred","path":"/deferred","sidebar":"docs"},{"id":"design-choices","path":"/design-choices","sidebar":"docs"},{"id":"dict","path":"/dict","sidebar":"docs"},{"id":"form-validation","path":"/form-validation","sidebar":"docs"},{"id":"future","path":"/future","sidebar":"docs"},{"id":"future-result","path":"/future-result","sidebar":"docs"},{"id":"getting-started","path":"/getting-started","sidebar":"docs"},{"id":"inspirations","path":"/inspirations","sidebar":"docs"},{"id":"installation","path":"/installation","sidebar":"docs"},{"id":"lazy","path":"/lazy","sidebar":"docs"},{"id":"nested-optional-values","path":"/nested-optional-values","sidebar":"docs"},{"id":"option","path":"/option","sidebar":"docs"},{"id":"react-request","path":"/react-request","sidebar":"docs"},{"id":"result","path":"/result","sidebar":"docs"},{"id":"retry","path":"/retry","sidebar":"docs"},{"id":"serializer","path":"/serializer","sidebar":"docs"}],"draftIds":[],"sidebars":{"docs":{"link":{"path":"/getting-started","label":"getting-started"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.4.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.0"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.4.0"}}}'),u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(412),o=n(5742),i=n(8780),l=n(7452);function s(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(u,{error:t}))}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function c(e){let{error:t,tryAgain:n}=e;return r.createElement(f,{fallback:()=>r.createElement(s,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(l.Z,null,r.createElement(s,{error:t,tryAgain:n})))}const d=e=>r.createElement(c,e);class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??d)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),u=n(412);const c=a.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:v=!0,...b}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,l.Z)(),{withBaseUrl:k}=(0,d.C)(),E=(0,a.useContext)(c),S=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>S.current));const x=f||p;const C=(0,s.Z)(x),T=x?.replace("pathname://","");let _=void 0!==T?(A=T,v&&(e=>e.startsWith("/"))(A)?k(A):A):void 0;var A;_&&C&&(_=(0,i.applyTrailingSlash)(_,{trailingSlash:y,baseUrl:w}));const L=(0,a.useRef)(!1),R=n?o.OL:o.rU,N=u.Z.canUseIntersectionObserver,P=(0,a.useRef)(),O=()=>{L.current||null==_||(window.docusaurus.preload(_),L.current=!0)};(0,a.useEffect)((()=>(!N&&C&&null!=_&&window.docusaurus.prefetch(_),()=>{N&&P.current&&P.current.disconnect()})),[P,_,N,C]);const I=_?.startsWith("#")??!1,D=!_||!C||I;return D||g||E.collectLink(_),D?a.createElement("a",(0,r.Z)({ref:S,href:_},x&&!C&&{target:"_blank",rel:"noopener noreferrer"},b)):a.createElement(R,(0,r.Z)({},b,{onMouseEnter:O,onTouchStart:O,innerRef:e=>{S.current=e,N&&e&&C&&(P.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(P.current.unobserve(e),P.current.disconnect(),null!=_&&window.docusaurus.prefetch(_))}))})),P.current.observe(e))},to:_},n&&{isActive:h,activeClassName:m}))}const p=a.forwardRef(f)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>v,gA:()=>p,WS:()=>m,_r:()=>d,Jo:()=>b,zh:()=>f,yW:()=>g,gB:()=>h});var r=n(6550),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function u(e,t){const n=s(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const c={},d=()=>i("docusaurus-plugin-content-docs")??c,f=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function m(e){void 0===e&&(e={});const t=p(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function h(e){return f(e).versions}function g(e){const t=f(e);return l(t)}function v(e){const t=f(e),{pathname:n}=(0,r.TH)();return u(t,n)}function b(e){const t=f(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:u(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},7452:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Rt});var r=n(7294),a=n(6010),o=n(4763),i=n(833),l=n(7462),s=n(6550),u=n(5999),c=n(5936);const d="docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,u.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:a}=p();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:a}),t))}var g=n(5281),v=n(9727);const b={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(h,{className:b.skipToContent})}var w=n(6668),k=n(9689);function E(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const S={closeButton:"closeButton_CVFx"};function x(e){return r.createElement("button",(0,l.Z)({type:"button","aria-label":(0,u.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",S.closeButton,e.className)}),r.createElement(E,{width:14,height:14,strokeWidth:3.1}))}const C={content:"content_knG7"};function T(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(C.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const _={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:_.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:_.announcementBarPlaceholder}),r.createElement(T,{className:_.announcementBarContent}),i&&r.createElement(x,{onClick:n,className:_.announcementBarClose}))}var L=n(3163),R=n(2466);var N=n(902),P=n(3102);const O=r.createContext(null);function I(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,P.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,N.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(O.Provider,{value:n},t)}function D(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function M(){const e=(0,r.useContext)(O);if(!e)throw new N.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,P.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:D(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=M();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var B=n(2949),j=n(2389);function z(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function U(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const l=(0,j.Z)(),s=(0,u.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===o?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)($.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",$.toggleButton,!l&&$.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!l,title:s,"aria-label":s,"aria-live":"polite"},r.createElement(z,{className:(0,a.Z)($.toggleIcon,$.lightToggleIcon)}),r.createElement(U,{className:(0,a.Z)($.toggleIcon,$.darkToggleIcon)})))}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Z(e){let{className:t}=e;const n=(0,w.L)().navbar.style,a=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,B.I)();return a?null:r.createElement(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var V=n(1327);function W(){return r.createElement(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,L.e)();return r.createElement("button",{type:"button","aria-label":(0,u.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(E,{color:"var(--ifm-color-emphasis-600)"}))}function Y(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(W,null),r.createElement(Z,{className:"margin-right--md"}),r.createElement(K,null))}var Q=n(9960),X=n(4996),J=n(3919),ee=n(8022),te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const f=(0,X.Z)(a),p=(0,X.Z)(t),m=(0,X.Z)(o,{forcePrependBaseUrl:!0}),h=i&&o&&!(0,J.Z)(o),g=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(te.Z,u&&{width:12,height:12}))};return o?r.createElement(Q.Z,(0,l.Z)({href:c?m:o},d,g)):r.createElement(Q.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?(0,ee.F)(n,t.pathname):t.pathname.startsWith(p)},d,g))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,l.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,l.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),le=n(8596),se=n(2263);function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.Mg)(e.to,t)||!!(0,ee.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[u]),r.createElement("div",{ref:u,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,l.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(qe,(0,l.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:o,onClick:i,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(ne,(0,l.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),p()}}),u.children??u.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(qe,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function fe(e){let{mobile:t=!1,...n}=e;const a=t?de:ce;return r.createElement(a,n)}var pe=n(4711);function me(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const he="iconLanguage_nlXk";function ge(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var ve=n(830),be=["translations"];function ye(){return ye=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var Se="Ctrl";var xe=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=Ee(e,be),i=a.buttonText,l=void 0===i?"Search":i,s=a.buttonAriaLabel,u=void 0===s?"Search":s,c=we((0,r.useState)(null),2),d=c[0],f=c[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("\u2318"):f(Se))}),[]),r.createElement("button",ye({type:"button",className:"DocSearch DocSearch-Button","aria-label":u},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(ve.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},l)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Se?r.createElement(ge,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Ce=n(5742),Te=n(6177),_e=n(239),Ae=n(3320);var Le=n(3935);const Re={button:{buttonText:(0,u.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,u.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,u.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,u.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,u.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,u.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,u.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,u.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,u.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,u.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,u.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,u.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,u.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,u.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,u.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,u.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,u.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,u.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,u.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,u.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,u.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,u.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,u.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,u.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,u.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,u.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,u.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Ne=null;function Pe(e){let{hit:t,children:n}=e;return r.createElement(Q.Z,{to:t.url},n)}function Oe(e){let{state:t,onClose:n}=e;const a=(0,Te.M)();return r.createElement(Q.Z,{to:a(t.query),onClick:n},r.createElement(u.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function Ie(e){let{contextualSearch:t,externalUrlRegex:a,...o}=e;const{siteMetadata:i}=(0,se.Z)(),u=(0,_e.l)(),c=function(){const{locale:e,tags:t}=(0,Ae._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=o.searchParameters?.facetFilters??[],f=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,p={...o.searchParameters,facetFilters:f},m=(0,s.k6)(),h=(0,r.useRef)(null),g=(0,r.useRef)(null),[v,b]=(0,r.useState)(!1),[y,w]=(0,r.useState)(void 0),k=(0,r.useCallback)((()=>Ne?Promise.resolve():Promise.all([n.e(780).then(n.bind(n,6780)),Promise.all([n.e(532),n.e(945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;Ne=t}))),[]),E=(0,r.useCallback)((()=>{k().then((()=>{h.current=document.createElement("div"),document.body.insertBefore(h.current,document.body.firstChild),b(!0)}))}),[k,b]),S=(0,r.useCallback)((()=>{b(!1),h.current?.remove()}),[b]),x=(0,r.useCallback)((e=>{k().then((()=>{b(!0),w(e.key)}))}),[k,b,w]),C=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.F)(a,t)?window.location.href=t:m.push(t)}}).current,T=(0,r.useRef)((e=>o.transformItems?o.transformItems(e):e.map((e=>({...e,url:u(e.url)}))))).current,_=(0,r.useMemo)((()=>e=>r.createElement(Oe,(0,l.Z)({},e,{onClose:S}))),[S]),A=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,a=e.onClose,o=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){(27===e.keyCode&&t||"k"===e.key.toLowerCase()&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}({isOpen:v,onOpen:E,onClose:S,onInput:x,searchButtonRef:g}),r.createElement(r.Fragment,null,r.createElement(Ce.Z,null,r.createElement("link",{rel:"preconnect",href:`https://${o.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})),r.createElement(xe,{onTouchStart:k,onFocus:k,onMouseOver:k,onClick:E,ref:g,translations:Re.button}),v&&Ne&&h.current&&(0,Le.createPortal)(r.createElement(Ne,(0,l.Z)({onClose:S,initialScrollY:window.scrollY,initialQuery:y,navigator:C,transformItems:T,hitComponent:Pe,transformSearchClient:A},o.searchPagePath&&{resultsFooterComponent:_},o,{searchParameters:p,placeholder:Re.placeholder,translations:Re.modal})),h.current))}function De(){const{siteConfig:e}=(0,se.Z)();return r.createElement(Ie,e.themeConfig.algolia)}const Me={searchBox:"searchBox_ZlJk"};function Fe(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,Me.searchBox)},t)}var Be=n(143),je=n(2802);var ze=n(373);const Ue=e=>e.docs.find((t=>t.id===e.mainDocId));const $e={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.Z)(),f=(0,pe.l)(),{search:p,hash:m}=(0,s.TH)(),h=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],g=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(fe,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:he}),g),items:h}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(Fe,{className:n},r.createElement(De,null))},dropdown:fe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Be.Iw)(a),s=(0,je.vY)(t,a);return null===s?null:r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Be.Iw)(a),s=(0,je.oz)(t,a).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,je.lO)(a)[0],s=t??i.label,u=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,l.Z)({},o,{label:s,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...c}=e;const{search:d,hash:f}=(0,s.TH)(),p=(0,Be.Iw)(n),m=(0,Be.gB)(n),{savePreferredVersionName:h}=(0,ze.J)(n),g=[...o,...m.map((e=>{const t=p.alternateDocVersions[e.name]??Ue(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...i],v=(0,je.lO)(n)[0],b=t&&g.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):v.label,y=t&&g.length>1?void 0:Ue(v).path;return g.length<=1?r.createElement(oe,(0,l.Z)({},c,{mobile:t,label:b,to:y,isActive:a?()=>!1:void 0})):r.createElement(fe,(0,l.Z)({},c,{mobile:t,label:b,to:y,items:g,isActive:a?()=>!1:void 0}))}};function qe(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=$e[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function He(){const e=(0,L.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(qe,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ge(e){return r.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Ze(){const e=0===(0,w.L)().navbar.items.length,t=M();return r.createElement(r.Fragment,null,!e&&r.createElement(Ge,{onClick:()=>t.hide()}),t.content)}function Ve(){const e=(0,L.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(F,{header:r.createElement(Y,null),primaryMenu:r.createElement(He,null),secondaryMenu:r.createElement(Ze,null)}):null}const We={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ke(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Ye(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,L.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,R.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,"aria-label":(0,u.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[We.navbarHideable,!s&&We.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Ke,{onClick:i.toggle}),r.createElement(Ve,null))}var Qe=n(8780);const Xe={errorBoundaryError:"errorBoundaryError_a6uf"};function Je(e){return r.createElement("button",(0,l.Z)({type:"button"},e),r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function et(e){let{error:t}=e;const n=(0,Qe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Xe.errorBoundaryError},n)}class tt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const nt="right";function rt(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,l.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function at(){const{toggle:e,shown:t}=(0,L.e)();return r.createElement("button",{onClick:e,"aria-label":(0,u.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(rt,null))}const ot={colorModeToggle:"colorModeToggle_DEke"};function it(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(tt,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},r.createElement(qe,e)))))}function lt(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function st(){const e=(0,L.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??nt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(lt,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(at,null),r.createElement(W,null),r.createElement(it,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(it,{items:a}),r.createElement(Z,{className:ot.colorModeToggle}),!o&&r.createElement(Fe,null,r.createElement(De,null)))})}function ut(){return r.createElement(Ye,null,r.createElement(st,null))}function ct(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,u=(0,X.Z)(n),c=(0,X.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(Q.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?c:a}:{to:u},s),o,a&&!(0,J.Z)(a)&&r.createElement(te.Z,null))}function dt(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(ct,{item:t}))}function ft(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(dt,{key:t,item:e})))))}function pt(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(ft,{key:t,column:e}))))}function mt(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function ht(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(ct,{item:t})}function gt(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(ht,{item:e}),t.length!==n+1&&r.createElement(mt,null))))))}function vt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(pt,{columns:t}):r.createElement(gt,{links:t})}var bt=n(941);const yt={footerLogoLink:"footerLogoLink_BH7S"};function wt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(bt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function kt(e){let{logo:t}=e;return t.href?r.createElement(Q.Z,{href:t.href,className:yt.footerLogoLink,target:t.target},r.createElement(wt,{logo:t})):r.createElement(wt,{logo:t})}function Et(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function St(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function xt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(St,{style:o,links:n&&n.length>0&&r.createElement(vt,{links:n}),logo:a&&r.createElement(kt,{logo:a}),copyright:t&&r.createElement(Et,{copyright:t})})}const Ct=r.memo(xt),Tt=(0,N.Qc)([B.S,k.pl,R.OC,ze.L5,i.VC,function(e){let{children:t}=e;return r.createElement(P.n2,null,r.createElement(L.M,null,r.createElement(I,null,t)))}]);function _t(e){let{children:t}=e;return r.createElement(Tt,null,t)}function At(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(Je,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(et,{error:t})))))}const Lt={mainWrapper:"mainWrapper_z2l0"};function Rt(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:u}=e;return(0,v.t)(),r.createElement(_t,null,r.createElement(i.d,{title:s,description:u}),r.createElement(y,null),r.createElement(A,null),r.createElement(ut,null),r.createElement("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,Lt.mainWrapper,l)},r.createElement(o.Z,{fallback:e=>r.createElement(At,e)},t)),!n&&r.createElement(Ct,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),u=n(941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(u.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:u}}=(0,s.L)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,i.Z)(u?.href||"/"),h=n?"":t,g=u?.alt??h;return a.createElement(o.Z,(0,r.Z)({to:m},p,u?.target&&{target:u.target}),u&&a.createElement(c,{logo:u,alt:g,imageClassName:d}),null!=n&&a.createElement("b",{className:f},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],c)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>g});var r=n(7462),a=n(7294),o=n(412);const i="ease-in-out";function l(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const s={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function c(e,t){const n=t?s:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function d(e){if(window.matchMedia("(prefers-reduced-motion: reduce)").matches)return 0;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}function f(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=function(){const t=e.scrollHeight;return{transition:`height ${r?.duration??d(t)}ms ${r?.easing??i}`,height:`${t}px`}}();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return c(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(a(),requestAnimationFrame((()=>{e.style.height=s.height,e.style.overflow=s.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{a()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function p(e){if(!o.Z.canUseDOM)return e?s:u}function m(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const u=(0,a.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:o}),a.createElement(t,{ref:u,style:s?void 0:p(n),onTransitionEnd:e=>{"height"===e.propertyName&&(c(u.current,n),i?.(n))},className:l},r)}function h(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(m,(0,r.Z)({},n,{collapsed:l})):null}function g(e){let{lazy:t,...n}=e;const r=t?h:m;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),u=(0,o.WA)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),u="theme",c=(0,i.WA)(u),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{c.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[a,o]=(0,r.useState)(p(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(s.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>b,L5:()=>g,Oh:()=>y});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(2802),s=n(902),u=n(12);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(c(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return r.createElement(p.Provider,{value:n},t)}function g(e){let{children:t}=e;return l.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(p);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function b(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=v(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function y(){const e=(0,a._r)(),[t]=v();function n(n){const r=e[n],{preferredVersionName:a}=t[n];return r.versions.find((e=>e.name===a))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>f});var r=n(7294),a=n(3102),o=n(7524),i=n(1980),l=n(6668),s=n(902);const u=r.createContext(void 0);function c(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,l.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[s,u]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(s)return u(!1),!1}));const c=(0,r.useCallback)((()=>{u((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&u(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:s})),[e,n,c,s])}function d(e){let{children:t}=e;const n=c();return r.createElement(u.Provider,{value:n},t)}function f(){const e=r.useContext(u);if(void 0===e)throw new s.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{K:()=>l,M:()=>s});var r=n(7294),a=n(2263),o=n(1980);const i="q";function l(){return(0,o.Nc)(i)}function s(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,a.Z)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const s=!1;function u(){const[e,t]=(0,r.useState)((()=>s?"ssr":l()));return(0,r.useEffect)((()=>{function e(){t(l())}const n=s?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},2802:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>h,cE:()=>d,hI:()=>k,lO:()=>b,vY:()=>w,oz:()=>y,s1:()=>v});var r=n(7294),a=n(6550),o=n(8790),i=n(143),l=n(373),s=n(1116);function u(e){return Array.from(new Set(e))}var c=n(8596);const d=!!i._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,c.Mg)(e,t),m=(e,t)=>e.some((e=>h(e,t)));function h(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||m(e.items,t))}function g(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,c.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,c.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function v(){const e=(0,s.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?g({sidebarItems:e.items,pathname:t}):null}function b(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function y(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${Object.keys(t).join("\n- ")}`);return r[1]}),[e,n])}function w(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function k(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:u}}},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(2263);function a(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:a}=t;return e?.trim().length?`${e.trim()} ${a} ${n}`:n}},1980:(e,t,n)=>{"use strict";n.d(t,{Nc:()=>u,Rb:()=>l});var r=n(7294),a=n(6550),o=n(1688),i=n(902);function l(e){!function(e){const t=(0,a.k6)(),n=(0,i.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,a.k6)();return(0,o.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function u(e){const t=s(e)??"",n=function(){const e=(0,a.k6)();return(0,r.useCallback)(((t,n,r)=>{const a=new URLSearchParams(e.location.search);n?a.set(t,n):a.delete(t),(r?.push?e.push:e.replace)({search:a.toString()})}),[e])}();return[t,(0,r.useCallback)(((t,r)=>{n(e,t,r)}),[n,e])]}},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>c,VC:()=>p});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),u=n(2128);function c(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const c=(0,u.p)(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>u,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d});var r=n(7294),a=n(412),o=n(2389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(c()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>s,os:()=>l});var r=n(143),a=n(2263),o=n(373);const i="default";function l(e,t){return`docs-${e}-${t}`}function s(){const{i18n:e}=(0,a.Z)(),t=(0,r._r)(),n=(0,r.WS)(),s=(0,o.Oh)();const u=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,a=s[e],o=t[e].versions.find((e=>e.isLast));return l(e,(r??a??o).name)}))];return{locale:e.currentLocale,tags:u}}},12:(e,t,n)=>{"use strict";n.d(t,{WA:()=>s});n(7294),n(1688);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=o(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var r=n(2263),a=n(6550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace(`/${o}/`,"/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${l}`:`${l}${e}/`}(r)}${s}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){const{siteConfig:{themeConfig:e}}=(0,r.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(7294),a=n(8022),o=n(4996),i=n(6278);function l(){const{withBaseUrl:e}=(0,o.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,r.useCallback)((r=>{const o=new URL(r);if((0,a.F)(t,o.href))return r;const i=`${o.pathname+o.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>T,ob:()=>p,PP:()=>A,Ep:()=>f});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(8776);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,h(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);S+=E.value.length,E=E.next){var x=E.value;if(t.length>e.length)return;if(!(x instanceof a)){var C,T=1;if(b){if(!(C=o(k,S,e,v))||C.index>=e.length)break;var _=C.index,A=C.index+C[0].length,L=S;for(L+=E.value.length;_>=L;)L+=(E=E.next).value.length;if(S=L-=E.value.length,E.value instanceof a)continue;for(var R=E;R!==t.tail&&(Ld.reach&&(d.reach=I);var D=E.prev;if(P&&(D=s(t,D,P),S+=P.length),u(t,D,T),E=s(t,D,new a(f,g?r.tokenize(N,g):N,y,N)),O&&s(t,E,O),T>1){var M={cause:f+","+m,reach:I};i(e,t,n,E.prev,S,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function u(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=u(c[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var h=[p];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),v=f.substring(m+p.length),b=[];h&&b.push.apply(b,i([h])),b.push(g),v&&b.push.apply(b,i([v])),"string"==typeof u?l.splice.apply(l,[s,1].concat(b)):u.content=b}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function u(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,u),t(s.optional,u),t(s.modify,u)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),u=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(u),l=(l||[]).map(u);var c=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var f,p=r(s),m=c;a(m);){for(var h in f={},m){var g=s[h];t(g&&g.modify,(function(e){e in d&&(f[e]=!0)}))}for(var v in d)if(!(v in c))for(var b in p(v))if(b in c){f[v]=!0;break}for(var y in m=f)c[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function u(e){if(e in l)return l[e];s[e]=!0;var a,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)a=r(e);else{var f=i(c.map((function(e){var t=u(e);return delete s[e],t})));o?a=o(f,(function(){return r(e)})):r(e)}return l[e]=a}for(var c in n)u(c);var d=[];for(var f in s)d.push(l[f]);return i(d)}(p,c,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n