mod.rs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. use flowy_ot::delta::Delta;
  2. use rand::{prelude::*, Rng as WrappedRng};
  3. pub struct Rng(StdRng);
  4. impl Default for Rng {
  5. fn default() -> Self { Rng(StdRng::from_rng(thread_rng()).unwrap()) }
  6. }
  7. impl Rng {
  8. pub fn from_seed(seed: [u8; 32]) -> Self { Rng(StdRng::from_seed(seed)) }
  9. pub fn gen_string(&mut self, len: usize) -> String {
  10. (0..len).map(|_| self.0.gen::<char>()).collect()
  11. }
  12. pub fn gen_delta(&mut self, s: &str) -> Delta {
  13. let mut op = Delta::default();
  14. loop {
  15. let left = s.chars().count() - op.base_len();
  16. if left == 0 {
  17. break;
  18. }
  19. let i = if left == 1 {
  20. 1
  21. } else {
  22. 1 + self.0.gen_range(0, std::cmp::min(left - 1, 20))
  23. };
  24. match self.0.gen_range(0.0, 1.0) {
  25. f if f < 0.2 => {
  26. op.insert(&self.gen_string(i));
  27. },
  28. f if f < 0.4 => {
  29. op.delete(i as u64);
  30. },
  31. _ => {
  32. op.retain(i as u64);
  33. },
  34. }
  35. }
  36. if self.0.gen_range(0.0, 1.0) < 0.3 {
  37. op.insert(&("1".to_owned() + &self.gen_string(10)));
  38. }
  39. op
  40. }
  41. }