nu_command/filters/
shuffle.rs1use nu_engine::command_prelude::*;
2use rand::{prelude::SliceRandom, rng};
3
4#[derive(Clone)]
5pub struct Shuffle;
6
7impl Command for Shuffle {
8 fn name(&self) -> &str {
9 "shuffle"
10 }
11
12 fn signature(&self) -> nu_protocol::Signature {
13 Signature::build("shuffle")
14 .input_output_types(vec![(
15 Type::List(Box::new(Type::Any)),
16 Type::List(Box::new(Type::Any)),
17 )])
18 .category(Category::Filters)
19 }
20
21 fn description(&self) -> &str {
22 "Shuffle rows randomly."
23 }
24
25 fn run(
26 &self,
27 engine_state: &EngineState,
28 _stack: &mut Stack,
29 call: &Call,
30 input: PipelineData,
31 ) -> Result<PipelineData, ShellError> {
32 let metadata = input.metadata();
33 let mut values = input.into_iter_strict(call.head)?.collect::<Vec<_>>();
34 values.shuffle(&mut rng());
35 let iter = values.into_iter();
36 Ok(iter.into_pipeline_data_with_metadata(
37 call.head,
38 engine_state.signals().clone(),
39 metadata,
40 ))
41 }
42
43 fn examples(&self) -> Vec<Example<'_>> {
44 vec![Example {
45 description: "Shuffle rows randomly (execute it several times and see the difference)",
46 example: r#"[[version patch]; ['1.0.0' false] ['3.0.1' true] ['2.0.0' false]] | shuffle"#,
47 result: None,
48 }]
49 }
50}