parent
f648646317
commit
5c889fed0d
@ -0,0 +1,83 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
[[package]]
|
||||||
|
name = "cfg-if"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "getrandom"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"libc",
|
||||||
|
"wasi",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.86"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ppv-lite86"
|
||||||
|
version = "0.2.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.8.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"rand_chacha",
|
||||||
|
"rand_core",
|
||||||
|
"rand_hc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_chacha"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d"
|
||||||
|
dependencies = [
|
||||||
|
"ppv-lite86",
|
||||||
|
"rand_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_core"
|
||||||
|
version = "0.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c026d7df8b298d90ccbbc5190bd04d85e159eaf5576caeacf8741da93ccbd2e5"
|
||||||
|
dependencies = [
|
||||||
|
"getrandom",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_hc"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73"
|
||||||
|
dependencies = [
|
||||||
|
"rand_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "shuffle3rs"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"rand",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasi"
|
||||||
|
version = "0.10.2+wasi-snapshot-preview1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
|
@ -0,0 +1,10 @@
|
|||||||
|
[package]
|
||||||
|
name = "shuffle3rs"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Avril <flanchan@cumallover.me>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
rand = "0.8.3"
|
@ -0,0 +1,34 @@
|
|||||||
|
use rand::Rng;
|
||||||
|
use crate::shuffle;
|
||||||
|
|
||||||
|
pub trait SliceElementExt<T>
|
||||||
|
{
|
||||||
|
fn random_element<R: Rng + ?Sized>(&self, rng: &mut R) -> &T;
|
||||||
|
fn random_element_mut<R: Rng + ?Sized>(&mut self, rng: &mut R) -> &mut T;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait ShuffleExt<T>
|
||||||
|
{
|
||||||
|
fn shuffle<R: Rng + ?Sized>(&mut self, rng: &mut R);
|
||||||
|
fn unshuffle<R: Rng + ?Sized>(&mut self, rng: &mut R);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> SliceElementExt<T> for [T]
|
||||||
|
{
|
||||||
|
#[inline] fn random_element<R: Rng + ?Sized>(&self, rng: &mut R) -> &T {
|
||||||
|
shuffle::element_in(self, rng)
|
||||||
|
}
|
||||||
|
#[inline] fn random_element_mut<R: Rng + ?Sized>(&mut self, rng: &mut R) -> &mut T {
|
||||||
|
shuffle::element_in_mut(self, rng)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> ShuffleExt<T> for [T]
|
||||||
|
{
|
||||||
|
#[inline] fn shuffle<R: Rng + ?Sized>(&mut self, rng: &mut R) {
|
||||||
|
shuffle::shuffle(self, rng)
|
||||||
|
}
|
||||||
|
#[inline] fn unshuffle<R: Rng + ?Sized>(&mut self, rng: &mut R) {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
#![allow(dead_code)]
|
||||||
|
|
||||||
|
#[macro_use] mod ext; use ext::*;
|
||||||
|
mod shuffle;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("Hello, world!");
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
use rand::Rng;
|
||||||
|
use std::mem::swap;
|
||||||
|
|
||||||
|
|
||||||
|
/// Get a random element in this slice.
|
||||||
|
pub fn element_in<'a, T, R: Rng + ?Sized>(slice: &'a (impl AsRef<[T]> + ?Sized), with: &mut R) -> &'a T
|
||||||
|
{
|
||||||
|
let slice = slice.as_ref();
|
||||||
|
&slice[with.gen_range(0..slice.len())]
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get a random element in this slice.
|
||||||
|
pub fn element_in_mut<'a, T, R: Rng + ?Sized>(slice: &'a mut (impl AsMut<[T]> + ?Sized), with: &mut R) -> &'a mut T
|
||||||
|
{
|
||||||
|
inside(slice.as_mut(), with)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[inline(always)] fn inside<'a, T, R: Rng + ?Sized>(slice: &'a mut [T], with: &mut R) -> &'a mut T
|
||||||
|
{
|
||||||
|
&mut slice[with.gen_range(0..slice.len())]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn shuffle_slice<T, R: Rng + ?Sized>(slice: &mut [T], with: &mut R)
|
||||||
|
{
|
||||||
|
match slice
|
||||||
|
{
|
||||||
|
&mut [] | &mut [_] => {},
|
||||||
|
&mut [ref mut inner @ .. , ref mut b] => {
|
||||||
|
swap(b, inside(inner, with));
|
||||||
|
shuffle(inner, with);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: unshuffle
|
||||||
|
|
||||||
|
/// Shuffle this slice with this `Rng`.
|
||||||
|
#[inline(always)] pub fn shuffle<T, R: Rng + ?Sized>(mut slice: impl AsMut<[T]>, with: &mut R)
|
||||||
|
{
|
||||||
|
shuffle_slice(slice.as_mut(), with)
|
||||||
|
}
|
Loading…
Reference in new issue