gnablib
Version:
A lean, zero dependency library to provide a useful base for your project.
2 lines • 1.07 kB
JavaScript
/*! Copyright 2025 the gnablib contributors MPL-1.1 */
import{asLE as t}from"../endian/platform.js";import{sLen as s}from"../safe/safe.js";import{APrng32 as e}from"./APrng32.js";export class Sfc32 extends e{constructor(){super(...arguments),this.bitGen=32,this.safeBits=32}trueSave(){const s=new Uint8Array(this._state.slice().buffer);return t.i32(s,0,4),s}rawNext(){const t=this._state[0]+this._state[1]+this._state[3];return this._state[3]+=1,this._state[0]=this._state[1]^this._state[1]>>>9,this._state[1]=this._state[2]+(this._state[2]<<3),this._state[2]=(this._state[2]<<21|this._state[2]>>>11)+t,t>>>0}get[Symbol.toStringTag](){return"sfc32"}static new(t=!1){return new Sfc32(Uint32Array.of(2027658023,3605857311,2741163597,16),t)}static seed(t,s,e,r=!1){const i=new Uint32Array(4);let a;null!=e?(i[0]=t,i[1]=s,i[2]=e,a=15):(i[1]=t,i[2]=s,a=12),i[3]=1;const n=new Sfc32(i,r);for(let t=0;t<a;t++)n.rawNext();return n}static restore(e,r=!1){s("state",e).exactly(16).throwNot();const i=e.slice();t.i32(i,0,4);const a=new Uint32Array(i.buffer);return new Sfc32(a,r)}}