{"version":3,"file":"alea.cjs","sources":["../src/alea.ts"],"sourcesContent":["// -----------------------------------------------------\r\n// \t\t\t\t\t\t Alea\r\n//\r\n//\tA port of an algorithm by Johannes Baagøe <baagoe@baagoe.com>, 2010\r\n//\thttp://baagoe.com/en/RandomMusings/javascript/\r\n//\r\n//\tOriginal work is under MIT license -\r\n//\r\n//\tCopyright (C) 2010 by Johannes Baagøe <baagoe@baagoe.org>\r\n//\r\n//\tPermission is hereby granted, free of charge, to any person obtaining a copy\r\n//\tof this software and associated documentation files (the \"Software\"), to deal\r\n//\tin the Software without restriction, including without limitation the rights\r\n//\tto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n//\tcopies of the Software, and to permit persons to whom the Software is\r\n//\tfurnished to do so, subject to the following conditions:\r\n//\r\n//\tThe above copyright notice and this permission notice shall be included in\r\n//\tall copies or substantial portions of the Software.\r\n//\r\n//\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n//\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n//\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n//\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n//\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n//\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n//\tTHE SOFTWARE.\r\n// -----------------------------------------------------\r\n\r\nconst _mashMagicNumber = 0.025_196_032_824_169_38;\r\nconst _fractionalFix = Number.EPSILON / 2;\r\n\r\n/**\r\n * Equivalent to 2^32\r\n *\r\n * @private\r\n */\r\nconst _twoPow32 = 0x1_00_00_00_00;\r\n/**\r\n * Equivalent to 2^-32\r\n *\r\n * @private\r\n */\r\nconst _twoPowNegative32 = 2 ** -32;\r\n\r\n/**\r\n * Mash factory\r\n * returns an alea mash function\r\n *\r\n * @private\r\n * @returns a stateful hash function\r\n */\r\nconst _aleaMash = () => {\r\n\tlet _state = 0xef_c8_24_9d;\r\n\t/**\r\n\t * Mash\r\n\t *\r\n\t * hash used in alea\r\n\t *\r\n\t * @param input - a value to mash\r\n\t * @returns a hashed version of the input\r\n\t */\r\n\tconst mash = (input: { toString: () => string }): number => {\r\n\t\tconst inputString = input.toString();\r\n\t\tfor (var index = 0; index < inputString.length; index++) {\r\n\t\t\t_state += inputString.charCodeAt(index);\r\n\t\t\tvar h = _mashMagicNumber * _state;\r\n\t\t\t_state = h >>> 0;\r\n\t\t\th -= _state;\r\n\t\t\th *= _state;\r\n\t\t\t_state = h >>> 0;\r\n\t\t\th -= _state;\r\n\t\t\t_state += h * _twoPow32; // 2^32\r\n\t\t}\r\n\t\treturn (_state >>> 0) * _twoPowNegative32; // 2^-32\r\n\t};\r\n\r\n\treturn mash;\r\n};\r\n\r\n/**\r\n * aleaState\r\n *\r\n * the three 32 bit seeds of alea and a dynamic integration constant\r\n */\r\ninterface aleaState {\r\n\tseed0: number;\r\n\tseed1: number;\r\n\tseed2: number;\r\n\tconstant: number;\r\n}\r\n\r\n/**\r\n * aleaType\r\n *\r\n * The required functions of an alea implementation\r\n */\r\nexport interface aleaType {\r\n\t/**\r\n\t * @returns a 32 bit number between `[0,1)` like Math.random\r\n\t */\r\n\trandom(): number;\r\n\t/**\r\n\t * @returns an integer `[0, 2^32)`\r\n\t */\r\n\tuint32(): number;\r\n\t/**\r\n\t * @returns a pseudo-random 53-bit number between `[0, 1)`, higher precision than random()\r\n\t */\r\n\tfract53(): number;\r\n\t/** @returns Exports the current state of the alea prng*/\r\n\texportState(): aleaState;\r\n\t/**\r\n\t * Imports the current state of the alea prng\r\n\t *\r\n\t * @param state - the new state to change the prng to\r\n\t */\r\n\timportState(state: Readonly<aleaState>): void;\r\n}\r\n\r\n/**\r\n * aleaFactory\r\n *\r\n * creates a seedable pseduo random number generator\r\n *\r\n * @param seed - the seed for the pseudo random generations\r\n * @returns a pseduo random number generator\r\n */\r\nexport const aleaFactory = (\r\n\tseed = `${Date.now()}` as { toString: () => string }\r\n): aleaType => {\r\n\tconst _mash = _aleaMash();\r\n\r\n\tconst _state = [_mash(' '), _mash(' '), _mash(' '), 1];\r\n\r\n\t_state[0] -= _mash(seed);\r\n\tif (_state[0] < 0) _state[0] += 1;\r\n\r\n\t_state[1] -= _mash(seed);\r\n\tif (_state[1] < 0) _state[1] += 1;\r\n\r\n\t_state[2] -= _mash(seed);\r\n\tif (_state[2] < 0) _state[2] += 1;\r\n\r\n\tconst aleaObject = {\r\n\t\trandom: () => {\r\n\t\t\tconst _temporary =\r\n\t\t\t\t2_091_639 * _state[0] + _state[3] * _twoPowNegative32;\r\n\t\t\t_state[0] = _state[1];\r\n\t\t\t_state[1] = _state[2];\r\n\t\t\treturn (_state[2] =\r\n\t\t\t\t_temporary - (_state[3] = Math.floor(_temporary)));\r\n\t\t},\r\n\t\tuint32: () => aleaObject.random() * _twoPow32,\r\n\t\tfract53: () => {\r\n\t\t\treturn (\r\n\t\t\t\taleaObject.random() +\r\n\t\t\t\tMath.trunc(aleaObject.random() * 0x20_00_00) * _fractionalFix\r\n\t\t\t);\r\n\t\t},\r\n\t\texportState: (): aleaState => ({\r\n\t\t\tseed0: _state[0],\r\n\t\t\tseed1: _state[1],\r\n\t\t\tseed2: _state[2],\r\n\t\t\tconstant: _state[3],\r\n\t\t}),\r\n\t\timportState: (inputState: Readonly<aleaState>): void => {\r\n\t\t\t[_state[0], _state[1], _state[2], _state[3]] = [\r\n\t\t\t\tinputState.seed0,\r\n\t\t\t\tinputState.seed1,\r\n\t\t\t\tinputState.seed2,\r\n\t\t\t\tinputState.constant,\r\n\t\t\t];\r\n\t\t},\r\n\t};\r\n\treturn aleaObject;\r\n};\r\n\r\nexport const alea = aleaFactory().random;\r\n"],"names":["_fractionalFix","Number","EPSILON","_twoPowNegative32","Math","pow","aleaFactory","seed","Date","now","_mash","_state","input","inputString","toString","index","length","h","charCodeAt","_aleaMash","aleaObject","random","_temporary","floor","uint32","fract53","trunc","exportState","seed0","seed1","seed2","constant","importState","inputState","_ref","alea"],"mappings":"AA6BA,IACMA,EAAiBC,OAAOC,QAAU,EAalCC,EAAiBC,KAAAC,IAAG,GAAM,IAqFnBC,EAAc,SAC1BC,QAAAA,IAAAA,IAAAA,KAAUC,KAAKC,OAEf,IAAMC,EA/EW,WACjB,IAAIC,EAAS,WAwBb,OAfa,SAACC,GAEb,IADA,IAAMC,EAAcD,EAAME,WACjBC,EAAQ,EAAGA,EAAQF,EAAYG,OAAQD,IAAS,CAExD,IAAIE,EArCkB,oBAoCtBN,GAAUE,EAAYK,WAAWH,IAGjCE,GADAN,EAASM,IAAM,EAGfN,GADAM,GAAKN,KACU,EAEfA,GAnCe,YAkCfM,GAAKN,GAGN,OAAQA,IAAW,GAAKR,GAyDXgB,GAERR,EAAS,CAACD,EAAM,KAAMA,EAAM,KAAMA,EAAM,KAAM,GAEpDC,EAAO,IAAMD,EAAMH,GACfI,EAAO,GAAK,IAAGA,EAAO,IAAM,GAEhCA,EAAO,IAAMD,EAAMH,GACfI,EAAO,GAAK,IAAGA,EAAO,IAAM,GAEhCA,EAAO,IAAMD,EAAMH,GACfI,EAAO,GAAK,IAAGA,EAAO,IAAM,GAEhC,IAAMS,EAAa,CAClBC,OAAQ,WACP,IAAMC,EACL,QAAYX,EAAO,GAAKA,EAAO,GAAKR,EAGrC,OAFAQ,EAAO,GAAKA,EAAO,GACnBA,EAAO,GAAKA,EAAO,GACXA,EAAO,GACdW,GAAcX,EAAO,GAAKP,KAAKmB,MAAMD,KAEvCE,OAAQ,WAAA,OApHQ,WAoHFJ,EAAWC,UACzBI,QAAS,WACR,OACCL,EAAWC,SACXjB,KAAKsB,MAA4B,QAAtBN,EAAWC,UAAyBrB,GAGjD2B,YAAa,WAAkB,MAAA,CAC9BC,MAAOjB,EAAO,GACdkB,MAAOlB,EAAO,GACdmB,MAAOnB,EAAO,GACdoB,SAAUpB,EAAO,KAElBqB,YAAa,SAACC,GACkC,IAAAC,EAAA,CAC9CD,EAAWL,MACXK,EAAWJ,MACXI,EAAWH,MACXG,EAAWF,UAJXpB,EAAO,GAD8CuB,EAAA,GAC1CvB,EAAO,GADmCuB,EAAA,GAC/BvB,EAAO,GAAIA,EAAAA,GAAAA,EAAO,GADauB,EAAA,KASxD,OAAOd,GAGKe,EAAO7B,IAAce"}