@@ -22,11 +22,16 @@ export function useRNG(rng?: RNGSource): () => number {
2222 return JSRNG ;
2323}
2424
25+ type Percent = `${number } %`;
2526function sample ( input : null , rng ?: RNGSource ) : number ;
2627function sample ( input : number , rng ?: RNGSource ) : number ;
2728function sample ( input : [ number , number ] , rng ?: RNGSource ) : number ;
2829function sample ( input : Record < string , number > , rng ?: RNGSource ) : string ;
29- function sample ( input : null | number | [ number , number ] | Record < string , number > , rng ?: RNGSource ) : number | string {
30+ function sample ( input : Percent , rng ?: RNGSource ) : boolean ;
31+ function sample (
32+ input : null | number | [ number , number ] | Record < string , number > | Percent ,
33+ rng ?: RNGSource
34+ ) : number | string | boolean {
3035 const RNG = useRNG ( rng ) ;
3136 if ( ! input ) return RNG ( ) ;
3237 if ( typeof input === 'number' ) return Math . floor ( input * RNG ( ) ) ;
@@ -42,6 +47,11 @@ function sample(input: null | number | [number, number] | Record<string, number>
4247 const lookup = totalWeight * RNG ( ) ;
4348 return thresholds . find ( ( [ , weight ] ) => lookup < weight ) ! [ 0 ] ;
4449 }
50+ if ( typeof input === 'string' && input . endsWith ( '%' ) ) {
51+ const percentage = parseFloat ( input . slice ( 0 , - 1 ) ) ;
52+ if ( isNaN ( percentage ) ) throw new Error ( `Invalid percentage ${ input } ` ) ;
53+ return RNG ( ) * 100 < percentage ;
54+ }
4555 return RNG ( ) ;
4656}
4757
0 commit comments