type StateBuilder = Record; type ComplexStateBuilder = StateBuilder & Record; interface OtherAlgorithm { (seed?: string, options?: { state?: false }): seedrandom.PRNG; (seed?: string, options?: { state: State | true }): seedrandom.StatefulPRNG; } type Callback = ( prng: seedrandom.PRNG, seed: string, is_math_call: boolean, state: undefined | boolean | seedrandom.State.Arc4, ) => callbackReturnType; interface callbackOption { pass: Callback; } interface stateOptionEnabled { state: true | seedrandom.State.Arc4; } interface seedrandomOptions { global?: boolean; state?: boolean | seedrandom.State.Arc4; entropy?: boolean; pass?: Callback; } declare namespace seedrandom { interface PRNG { (): number; double(): number; int32(): number; quick(): number; } interface StatefulPRNG extends PRNG { state(): State; } namespace State { type Arc4 = ComplexStateBuilder<"i" | "j", "S">; type Alea = StateBuilder<"c" | "s0" | "s1" | "s2">; type Xor128 = StateBuilder<"x" | "y" | "z" | "w">; type Xorwow = StateBuilder<"x" | "y" | "z" | "w" | "v" | "d">; type Xorshift7 = ComplexStateBuilder<"i", "x">; type Xor4096 = ComplexStateBuilder<"i" | "w", "X">; type Tychei = StateBuilder<"a" | "b" | "c" | "d">; } } interface seedrandom { // Arc4 Algorithm, default seedrandom >(seed?: string, options?: O | boolean): O extends callbackOption< infer callbackReturnType > ? callbackReturnType : O extends stateOptionEnabled ? seedrandom.StatefulPRNG : seedrandom.PRNG; , callbackReturnType>( seed: string | undefined, options: O | boolean | undefined, callback: Callback, ): O extends callbackOption ? callbackReturnType : callbackReturnType; // Other Algorithms alea: OtherAlgorithm; xor128: OtherAlgorithm; xorwow: OtherAlgorithm; xorshift7: OtherAlgorithm; xor4096: OtherAlgorithm; tychei: OtherAlgorithm; } declare const seedrandom: seedrandom; export = seedrandom;