use crate::bools::random::{random_bools, RandomBools};
use crate::num::conversion::string::options::{FromSciStringOptions, SciSizeOptions, ToSciOptions};
use crate::num::random::geometric::{
geometric_random_negative_signeds, geometric_random_unsigneds, GeometricRandomNaturalValues,
GeometricRandomNegativeSigneds,
};
use crate::num::random::{random_unsigned_inclusive_range, RandomUnsignedInclusiveRange};
use crate::random::Seed;
use crate::rounding_modes::random::{random_rounding_modes, RandomRoundingModes};
pub struct RandomSciSizeOptions {
bs: RandomBools,
xs: GeometricRandomNaturalValues<u64>,
}
impl Iterator for RandomSciSizeOptions {
type Item = SciSizeOptions;
fn next(&mut self) -> Option<SciSizeOptions> {
let x = self.xs.next().unwrap();
Some(if self.bs.next().unwrap() {
if x == 0 {
SciSizeOptions::Complete
} else {
SciSizeOptions::Precision(x)
}
} else {
SciSizeOptions::Scale(x)
})
}
}
pub fn random_sci_size_options(
seed: Seed,
m_size_numerator: u64,
m_size_denominator: u64,
) -> RandomSciSizeOptions {
RandomSciSizeOptions {
bs: random_bools(seed.fork("bs")),
xs: geometric_random_unsigneds(seed.fork("xs"), m_size_numerator, m_size_denominator),
}
}
pub struct RandomToSciOptions {
us: RandomUnsignedInclusiveRange<u8>,
rms: RandomRoundingModes,
sos: RandomSciSizeOptions,
is: GeometricRandomNegativeSigneds<i64>,
bs: RandomBools,
}
impl Iterator for RandomToSciOptions {
type Item = ToSciOptions;
fn next(&mut self) -> Option<ToSciOptions> {
Some(ToSciOptions {
base: self.us.next().unwrap(),
rounding_mode: self.rms.next().unwrap(),
size_options: self.sos.next().unwrap(),
neg_exp_threshold: self.is.next().unwrap(),
lowercase: self.bs.next().unwrap(),
e_lowercase: self.bs.next().unwrap(),
force_exponent_plus_sign: self.bs.next().unwrap(),
include_trailing_zeros: self.bs.next().unwrap(),
})
}
}
pub fn random_to_sci_options(
seed: Seed,
m_size_numerator: u64,
m_size_denominator: u64,
) -> RandomToSciOptions {
RandomToSciOptions {
us: random_unsigned_inclusive_range(seed.fork("us"), 2, 36),
rms: random_rounding_modes(seed.fork("rms")),
sos: random_sci_size_options(seed.fork("sos"), m_size_numerator, m_size_denominator),
is: geometric_random_negative_signeds(
seed.fork("is"),
m_size_numerator,
m_size_denominator,
),
bs: random_bools(seed.fork("bs")),
}
}
pub struct RandomFromSciStringOptions {
us: RandomUnsignedInclusiveRange<u8>,
rms: RandomRoundingModes,
}
impl Iterator for RandomFromSciStringOptions {
type Item = FromSciStringOptions;
fn next(&mut self) -> Option<FromSciStringOptions> {
Some(FromSciStringOptions {
base: self.us.next().unwrap(),
rounding_mode: self.rms.next().unwrap(),
})
}
}
pub fn random_from_sci_string_options(seed: Seed) -> RandomFromSciStringOptions {
RandomFromSciStringOptions {
us: random_unsigned_inclusive_range(seed.fork("us"), 2, 36),
rms: random_rounding_modes(seed.fork("rms")),
}
}