UNPKG

@ededejr/randomly

Version:

A utility for generating random numbers very frequently.

1 lines 4.97 kB
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export class Randomly {\n\tprivate store: number[];\n\tprivate cursor = 0;\n\tprivate interval: number;\n\tprivate timerId?: NodeJS.Timeout;\n\n\tconstructor(options: Randomly.Options = {}) {\n\t\tthis.store = new Array(options.storeSize || 20)\n\t\t\t.fill(undefined)\n\t\t\t.map(() => Math.random());\n\t\tthis.interval = options.refreshInterval || 1000;\n\t\tthis.startTimer();\n\t}\n\n\t/**\n\t * Get a random number between 0 and 1.\n\t */\n\tget(): number {\n\t\treturn this.$get();\n\t}\n\n\t/**\n\t * Compare some conditions to a random value using a predicate.\n\t * @param predicate A function which accepts a number and returns a boolean.\n\t * @returns boolean\n\t */\n\tcompare(predicate: Randomly.ComparePredicate): boolean {\n\t\treturn predicate(this.$get());\n\t}\n\n\t/**\n\t * Determine if a random value is less than a given threshold.\n\t * @param threshold A value between 0 and 1\n\t * @returns boolean\n\t */\n\tlt(threshold: number): boolean {\n\t\treturn this.$get() < threshold;\n\t}\n\n\t/**\n\t * Determine if a random value is greater than a given threshold.\n\t * @param threshold A value between 0 and 1\n\t * @returns boolean\n\t */\n\tgt(threshold: number): boolean {\n\t\treturn this.$get() > threshold;\n\t}\n\n\t/**\n\t * Determine if a random value is between a lower and upper bound (exclusive)\n\t * @param lower A lower bound between 0 and 1\n\t * @param upper An upper bound between 0 and 1\n\t * @returns boolean\n\t */\n\tbetween(lower: number, upper: number): boolean {\n\t\tconst entry = this.$get();\n\t\treturn entry > lower && entry < upper;\n\t}\n\n\t/**\n\t * Decide between two given options.\n\t * @param optionA\n\t * @param optionB\n\t * @param threshold An optional parameter to increase (or decrease) the odds of a given option\n\t * @returns optionA or optionB\n\t */\n\tdecide<A, B>(optionA: A, optionB: B, threshold?: number): A | B {\n\t\tconst _threshold = threshold || Math.min(Math.max(this.$get(), 0.05), 0.95);\n\t\tconst decider = this.$get() > _threshold;\n\t\treturn decider ? optionA : optionB;\n\t}\n\n\t/**\n\t * Get a random number between 0 and n\n\t * @param n\n\t * @returns number\n\t */\n\tsample(n: number): number {\n\t\treturn Math.floor(this.$get() * n);\n\t}\n\n\t/**\n\t * Start the internal timer which updates\n\t * the store of random numbers.\n\t * @returns\n\t */\n\tstartTimer(): void {\n\t\tthis.randomizeStore();\n\t\tthis.stopTimer();\n\t\tthis.timerId = setTimeout(() => this.startTimer(), this.interval);\n\t}\n\n\t/**\n\t * Stop the internal timer which updates\n\t * the store of random numbers.\n\t */\n\tstopTimer(): void {\n\t\tif (this.timerId) {\n\t\t\tclearTimeout(this.timerId);\n\t\t}\n\t}\n\n\t/**\n\t * Randomize the store by generating a new set of random numbers.\n\t * @returns void\n\t */\n\tprivate randomizeStore() {\n\t\tif (!this.store) {\n\t\t\treturn;\n\t\t}\n\t\tthis.store = this.store.map(() => Math.random());\n\t}\n\n\t/**\n\t * Get a random value from the internal store of values.\n\t * @returns number\n\t */\n\tprivate $get() {\n\t\tconst result = this.store[this.cursor++];\n\n\t\tif (this.cursor === this.store.length) {\n\t\t\tthis.cursor = 0;\n\t\t}\n\n\t\treturn result;\n\t}\n}\n\nexport declare namespace Randomly {\n\texport interface Options {\n\t\tstoreSize?: number;\n\t\trefreshInterval?: number;\n\t}\n\n\texport type ComparePredicate = (n: number) => boolean;\n}\n"],"mappings":";AAAO,IAAM,WAAN,MAAe;AAAA,EAMrB,YAAY,UAA4B,CAAC,GAAG;AAJ5C,SAAQ,SAAS;AAKhB,SAAK,QAAQ,IAAI,MAAM,QAAQ,aAAa,EAAE,EAC5C,KAAK,MAAS,EACd,IAAI,MAAM,KAAK,OAAO,CAAC;AACzB,SAAK,WAAW,QAAQ,mBAAmB;AAC3C,SAAK,WAAW;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc;AACb,WAAO,KAAK,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,WAA+C;AACtD,WAAO,UAAU,KAAK,KAAK,CAAC;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAG,WAA4B;AAC9B,WAAO,KAAK,KAAK,IAAI;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAG,WAA4B;AAC9B,WAAO,KAAK,KAAK,IAAI;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,OAAe,OAAwB;AAC9C,UAAM,QAAQ,KAAK,KAAK;AACxB,WAAO,QAAQ,SAAS,QAAQ;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAa,SAAY,SAAY,WAA2B;AAC/D,UAAM,aAAa,aAAa,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG,IAAI,GAAG,IAAI;AAC1E,UAAM,UAAU,KAAK,KAAK,IAAI;AAC9B,WAAO,UAAU,UAAU;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,GAAmB;AACzB,WAAO,KAAK,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAmB;AAClB,SAAK,eAAe;AACpB,SAAK,UAAU;AACf,SAAK,UAAU,WAAW,MAAM,KAAK,WAAW,GAAG,KAAK,QAAQ;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAkB;AACjB,QAAI,KAAK,SAAS;AACjB,mBAAa,KAAK,OAAO;AAAA,IAC1B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAiB;AACxB,QAAI,CAAC,KAAK,OAAO;AAChB;AAAA,IACD;AACA,SAAK,QAAQ,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,CAAC;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,OAAO;AACd,UAAM,SAAS,KAAK,MAAM,KAAK,QAAQ;AAEvC,QAAI,KAAK,WAAW,KAAK,MAAM,QAAQ;AACtC,WAAK,SAAS;AAAA,IACf;AAEA,WAAO;AAAA,EACR;AACD;","names":[]}