FIFTEEN TIMES SPEED BOOST HOLY SHIT OMG HOW TF *<>*

pull/2/head
Isaac Mills 3 years ago
parent 651b1451c1
commit 325242674b
No known key found for this signature in database
GPG Key ID: B67D7410F33A0F61

@ -2,6 +2,8 @@
use indicatif::{ProgressBar, ProgressStyle}; use indicatif::{ProgressBar, ProgressStyle};
use linkify::{LinkFinder, LinkKind}; use linkify::{LinkFinder, LinkKind};
use rand::{Rng, RngCore, SeedableRng};
use rand_xoshiro::{Xoshiro256Plus, Xoshiro256PlusPlus};
use std::fs::File; use std::fs::File;
use std::io::{BufWriter, Error, Write}; use std::io::{BufWriter, Error, Write};
use std::path::Path; use std::path::Path;
@ -10,10 +12,8 @@ use constants::ACTIONS;
use constants::ACTIONS_SIZE; use constants::ACTIONS_SIZE;
use constants::FACES; use constants::FACES;
use constants::FACES_SIZE; use constants::FACES_SIZE;
use seeder::UwUSeeder;
mod constants; mod constants;
mod seeder;
macro_rules! progress_bar { macro_rules! progress_bar {
() => {{ () => {{
@ -36,7 +36,8 @@ pub struct UwUify<'a> {
faces: f64, faces: f64,
actions: f64, actions: f64,
stutters: f64, stutters: f64,
random: bool, floating_rng: Xoshiro256Plus,
int_rng: Xoshiro256PlusPlus,
linkify: LinkFinder, linkify: LinkFinder,
} }
@ -50,7 +51,8 @@ impl<'a> Default for UwUify<'a> {
faces: 0.05, faces: 0.05,
actions: 0.125, actions: 0.125,
stutters: 0.225, stutters: 0.225,
random: false, floating_rng: Xoshiro256Plus::seed_from_u64(69),
int_rng: Xoshiro256PlusPlus::seed_from_u64(420),
linkify: LinkFinder::new(), linkify: LinkFinder::new(),
} }
} }
@ -76,11 +78,15 @@ impl<'a> UwUify<'a> {
text: text.unwrap_or_default(), text: text.unwrap_or_default(),
input: infile.unwrap_or_default(), input: infile.unwrap_or_default(),
output: outfile.unwrap_or_default(), output: outfile.unwrap_or_default(),
random,
linkify, linkify,
..Default::default() ..Default::default()
}; };
if random {
uwuify.floating_rng = Xoshiro256Plus::seed_from_u64(rand::rngs::OsRng.next_u64());
uwuify.int_rng = Xoshiro256PlusPlus::seed_from_u64(rand::rngs::OsRng.next_u64());
}
if let Some(words) = words { if let Some(words) = words {
uwuify.words = words.parse::<f64>().unwrap(); uwuify.words = words.parse::<f64>().unwrap();
} }
@ -96,7 +102,7 @@ impl<'a> UwUify<'a> {
uwuify uwuify
} }
pub fn uwuify(&self) -> Result<(), Error> { pub fn uwuify(&mut self) -> Result<(), Error> {
// Handle Text // Handle Text
if !self.text.is_empty() { if !self.text.is_empty() {
// Handle Text Output // Handle Text Output
@ -149,22 +155,23 @@ impl<'a> UwUify<'a> {
} }
} }
fn uwuify_sentence<T: Write>(&self, text: &str, out: &mut T) -> Result<(), std::io::Error> { fn uwuify_sentence<T: Write>(&mut self, text: &str, out: &mut T) -> Result<(), std::io::Error> {
text.lines().try_for_each(|line| { text.lines().try_for_each(|line| {
line.split_whitespace() line.split_whitespace()
.map(|f| f.as_bytes()) .map(|f| f.as_bytes())
.try_for_each(|word| { .try_for_each(|word| {
let mut seeder = UwUSeeder::new(word, self.random); let random_value = self.floating_rng.gen_range(0.0..1.0);
let random_value = seeder.random();
if random_value <= self.faces { if random_value <= self.faces {
out.write_all(FACES[seeder.random_int(0..FACES_SIZE)])?; out.write_all(FACES[self.int_rng.gen_range(0..FACES_SIZE)])?;
out.write_all(b" ")?; out.write_all(b" ")?;
} else if random_value <= self.actions { } else if random_value <= self.actions {
out.write_all(ACTIONS[seeder.random_int(0..ACTIONS_SIZE)])?; out.write_all(ACTIONS[self.int_rng.gen_range(0..ACTIONS_SIZE)])?;
out.write_all(b" ")?; out.write_all(b" ")?;
} else if random_value <= self.stutters { } else if random_value <= self.stutters {
(0..seeder.random_int(1..2)).into_iter().try_for_each(|_| { (0..self.int_rng.gen_range(1..2))
.into_iter()
.try_for_each(|_| {
out.write_all(&[word[0]])?; out.write_all(&[word[0]])?;
out.write_all(b"-") out.write_all(b"-")
})?; })?;
@ -208,11 +215,12 @@ mod tests {
let mut linkify = LinkFinder::new(); let mut linkify = LinkFinder::new();
linkify.kinds(&[LinkKind::Email, LinkKind::Url]); linkify.kinds(&[LinkKind::Email, LinkKind::Url]);
linkify.url_must_have_scheme(false); linkify.url_must_have_scheme(false);
let uwuify = super::UwUify { let mut uwuify = super::UwUify {
text: include_str!("test.txt"), text: include_str!("test.txt"),
linkify, linkify,
..Default::default() ..Default::default()
}; };
b.iter(|| uwuify.uwuify()); b.iter(|| uwuify.uwuify());
} }
} }

@ -1,40 +0,0 @@
use std::hash::Hasher;
use rand::{
distributions::uniform::{SampleRange, SampleUniform},
Rng, RngCore, SeedableRng,
};
use rand_xoshiro::{Xoshiro256Plus, Xoshiro256PlusPlus};
pub struct UwUSeeder {
floating: Xoshiro256Plus,
int: Xoshiro256PlusPlus,
}
impl UwUSeeder {
#[inline]
pub fn new(word: &[u8], random: bool) -> UwUSeeder {
let entropy = if !random {
let mut hasher = ahash::AHasher::new_with_keys(1234, 5678);
hasher.write(word);
hasher.finish()
} else {
rand::rngs::OsRng.next_u64()
};
UwUSeeder {
floating: Xoshiro256Plus::seed_from_u64(entropy),
int: Xoshiro256PlusPlus::seed_from_u64(entropy),
}
}
#[inline]
pub fn random(&mut self) -> f64 {
self.floating.gen_range(0.0..1.0)
}
#[inline]
pub fn random_int<T: SampleUniform, R: SampleRange<T>>(&mut self, range: R) -> T {
self.int.gen_range(range)
}
}
Loading…
Cancel
Save