From 9f90d0153a0cd8b1e3cd13a5b67ed6600e889699 Mon Sep 17 00:00:00 2001 From: tuguzT Date: Thu, 7 Sep 2023 21:41:17 +0300 Subject: [PATCH] Add new operation to shuffle heterogenous list --- src/ops/mod.rs | 2 ++ src/ops/shuffle.rs | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/ops/shuffle.rs diff --git a/src/ops/mod.rs b/src/ops/mod.rs index ef66f69..0dc62c6 100644 --- a/src/ops/mod.rs +++ b/src/ops/mod.rs @@ -14,6 +14,7 @@ pub use self::{ remove::Remove, remove_many::{RemoveMany, RemoveManyIndex}, reverse::Reverse, + shuffle::Shuffle, to_ref::ToRef, unzip::Unzip, zip::Zip, @@ -32,6 +33,7 @@ mod prepend; mod remove; mod remove_many; mod reverse; +mod shuffle; mod to_ref; mod unzip; mod zip; diff --git a/src/ops/shuffle.rs b/src/ops/shuffle.rs new file mode 100644 index 0000000..8eb36d2 --- /dev/null +++ b/src/ops/shuffle.rs @@ -0,0 +1,38 @@ +use crate::{HList, Nil}; + +use super::{RemoveMany, RemoveManyIndex}; + +/// Shuffle current heterogenous list, or change order of its elements. +/// +/// Index generic parameter is used to determine a way to construct shuffled list, +/// because there may be more than one if type of elements is not unique. +pub trait Shuffle: RemoveMany +where + T: HList, + I: RemoveManyIndex, +{ + /// Shuffles current heterogenous list, or changes order of its elements. + /// + /// # Examples + /// + /// ``` + /// use hlist2::{hlist, HList, ops::Shuffle}; + /// + /// let list = hlist![1, 2.0, true, "hello world"]; + /// let shuffled: HList![bool, i32, &str, f32] = list.shuffle(); + /// assert_eq!(shuffled, hlist![true, 1, "hello world", 2.0]); + /// ``` + fn shuffle(self) -> T; +} + +impl Shuffle for T +where + L: HList, + T: RemoveMany, + I: RemoveManyIndex, +{ + fn shuffle(self) -> L { + let (list, _) = self.remove_many(); + list + } +}