From f926419def18b9a22c7b4780417daea26372fee2 Mon Sep 17 00:00:00 2001 From: Richard King Date: Sun, 16 Jul 2023 18:53:31 +0200 Subject: [PATCH] feat(boolean): add random boolean generator with optional bias --- packages/boolean/src/RandomBoolean/index.ts | 41 +++++++++++++++++++++ packages/boolean/src/index.ts | 9 +++-- 2 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 packages/boolean/src/RandomBoolean/index.ts diff --git a/packages/boolean/src/RandomBoolean/index.ts b/packages/boolean/src/RandomBoolean/index.ts new file mode 100644 index 0000000..ae3909b --- /dev/null +++ b/packages/boolean/src/RandomBoolean/index.ts @@ -0,0 +1,41 @@ +import { RandomEngine } from '@grandom/core' + +export default class RandomBoolean { + private _engine: RandomEngine + + constructor (engine: RandomEngine) { + this._engine = engine + } + + /** + * A1 + */ + boolean (): boolean + + /** + * B1 + */ + boolean (bias: number): boolean + + boolean (arg1?: any): boolean { + if (typeof arg1 !== 'undefined') { + if (typeof arg1 !== 'number') { + throw new TypeError(`bias must be a number, got: ${typeof arg1}.`) + } + + // NaN guard + if (arg1 === arg1) { + if (arg1 < 0) { + arg1 = 0 + } else if (arg1 > 1) { + arg1 = 1 + } + + // return this._engine.nextDouble() < arg1 + return this._engine.nextFloat() < arg1 + } + } + + return this._engine.nextBoolean() + } +} diff --git a/packages/boolean/src/index.ts b/packages/boolean/src/index.ts index eedf250..75e8991 100644 --- a/packages/boolean/src/index.ts +++ b/packages/boolean/src/index.ts @@ -1,4 +1,7 @@ -export const boolean = (): number => { +import { BasicEngine } from '@grandom/engines' +import RandomBoolean from './RandomBoolean' - throw new Error('Unimplemented.') -} +const random = new RandomBoolean(new BasicEngine()) +const boolean = random.boolean.bind(random) + +export default boolean