gnablib
Version:
A lean, zero dependency library to provide a useful base for your project.
2 lines • 2.63 kB
JavaScript
/*! Copyright 2024-2025 the gnablib contributors MPL-1.1 */
import{asLE as t}from"../endian/platform.js";import{U64 as s,U64MutArray as e}from"../primitive/number/U64.js";import{sLen as r}from"../safe/safe.js";import{APrng64 as o}from"./APrng64.js";class a extends o{constructor(){super(...arguments),this.bitGen=64}rawNext(){const t=this._gen(),s=this._state.at(1).lShift(17);return this._state.at(2).xorEq(this._state.at(0)),this._state.at(3).xorEq(this._state.at(1)),this._state.at(1).xorEq(this._state.at(2)),this._state.at(0).xorEq(this._state.at(3)),this._state.at(2).xorEq(s),this._state.at(3).lRotEq(45),t}}export class Xoshiro256p extends a{constructor(){super(...arguments),this.safeBits=53}_gen(){return this._state.at(0).add(this._state.at(3))}get[Symbol.toStringTag](){return"xoshiro256+"}static new(t=!1){return new Xoshiro256p(e.fromBytes(Uint32Array.of(2065550767,3793791033,2713282036,1853398634,2148091215,113532184,1917616620,4169906344)),t)}static seed(t,s,r,o,a=!1){const i=e.fromLen(4);return i.at(0).set(t),i.at(1).set(s),i.at(2).set(r),i.at(3).set(o),new Xoshiro256p(i,a)}static restore(s,o=!1){r("state",s).exactly(32).throwNot();const a=s.slice();t.i32(a,0,8);const i=e.fromBytes(a.buffer);return new Xoshiro256p(i,o)}}export class Xoshiro256pp extends a{constructor(){super(...arguments),this.safeBits=64}_gen(){const t=this._state.at(0).add(this._state.at(3)).mut();return t.lRotEq(23).addEq(this._state.at(0)),t}get[Symbol.toStringTag](){return"xoshiro256++"}static new(t=!1){return new Xoshiro256pp(e.fromBytes(Uint32Array.of(2065550767,3793791033,2713282036,1853398634,2148091215,113532184,1917616620,4169906344)),t)}static seed(t,s,r,o,a=!1){const i=e.fromLen(4);return i.at(0).set(t),i.at(1).set(s),i.at(2).set(r),i.at(3).set(o),new Xoshiro256pp(i,a)}static restore(s,o=!1){r("state",s).exactly(32).throwNot();const a=s.slice();t.i32(a,0,8);const i=e.fromBytes(a.buffer);return new Xoshiro256pp(i,o)}}const i=s.fromI32s(5,0),n=s.fromI32s(9,0);export class Xoshiro256ss extends a{constructor(){super(...arguments),this.safeBits=64}_gen(){const t=this._state.at(1).mul(i).mut();return t.lRotEq(7).mulEq(n),t}get[Symbol.toStringTag](){return"xoshiro256**"}static new(t=!1){return new Xoshiro256ss(e.fromBytes(Uint32Array.of(2065550767,3793791033,2713282036,1853398634,2148091215,113532184,1917616620,4169906344)),t)}static seed(t,s,r,o,a=!1){const i=e.fromLen(4);return i.at(0).set(t),i.at(1).set(s),i.at(2).set(r),i.at(3).set(o),new Xoshiro256ss(i,a)}static restore(s,o=!1){r("state",s).exactly(32).throwNot();const a=s.slice();t.i32(a,0,8);const i=e.fromBytes(a.buffer);return new Xoshiro256ss(i,o)}}