Skip to content

Commit 0d2ff08

Browse files
Added support for nested Ref ops
1 parent 4f985b3 commit 0d2ff08

8 files changed

Lines changed: 129 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2222
- `TupleRow<Idx>` and `TupleRowMut<Idx>` traits for indexing rows in tuples of tuples
2323
- `FirstTupleRow` and `LastTupleRow` convenience traits for accessing the first and last rows in tuples of tuples
2424
- `FirstTupleIndex` and `LastTupleIndex` convenience traits for accessing the first and last elements in tuples
25+
- `TupleRefMap` trait for applying `TupleRef` to each element of a tuple of tuples
26+
- `TupleMutMap` trait for applying `TupleMut` to each element of a tuple of tuples
2527

2628
## [0.1.0] - 2025-12-05
2729

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ The library provides several traits for working with tuples:
3131
- [`IntoTupleOption`](https://docs.rs/tuplities-option/latest/tuplities_option/trait.IntoTupleOption.html): Provides an [`into_options()`](https://docs.rs/tuplities-option/latest/tuplities_option/trait.IntoTupleOption.html#tymethod.into_options) method to convert a tuple into a tuple of options.
3232
- [`TupleRef`](https://docs.rs/tuplities-ref/latest/tuplities_ref/trait.TupleRef.html): Provides a [`tuple_ref()`](https://docs.rs/tuplities-ref/latest/tuplities_ref/trait.TupleRef.html#tymethod.tuple_ref) method to get references to each element in the tuple.
3333
- [`TupleMut`](https://docs.rs/tuplities-mut/latest/tuplities_mut/trait.TupleMut.html): Provides a [`tuple_mut()`](https://docs.rs/tuplities-mut/latest/tuplities_mut/trait.TupleMut.html#tymethod.tuple_mut) method to get mutable references to each element in the tuple.
34+
- [`TupleRefMap`](https://docs.rs/tuplities-ref/latest/tuplities_ref/trait.TupleRefMap.html): Provides a [`tuple_ref_map()`](https://docs.rs/tuplities-ref/latest/tuplities_ref/trait.TupleRefMap.html#tymethod.tuple_ref_map) method to apply `TupleRef` to each element of a tuple of tuples, returning a tuple of tuples of references.
35+
- [`TupleMutMap`](https://docs.rs/tuplities-mut/latest/tuplities_mut/trait.TupleMutMap.html): Provides a [`tuple_mut_map()`](https://docs.rs/tuplities-mut/latest/tuplities_mut/trait.TupleMutMap.html#tymethod.tuple_mut_map) method to apply `TupleMut` to each element of a tuple of tuples, returning a tuple of tuples of mutable references.
3436
- [`TuplePopFront`](https://docs.rs/tuplities-pop-front/latest/tuplities_pop_front/trait.TuplePopFront.html): Provides a [`pop_front()`](https://docs.rs/tuplities-pop-front/latest/tuplities_pop_front/trait.TuplePopFront.html#tymethod.pop_front) method to remove and return the first element of the tuple along with the remaining elements as a new tuple.
3537
- [`TuplePopBack`](https://docs.rs/tuplities-pop-back/latest/tuplities_pop_back/trait.TuplePopBack.html): Provides a [`pop_back()`](https://docs.rs/tuplities-pop-back/latest/tuplities_pop_back/trait.TuplePopBack.html#tymethod.pop_back) method to remove and return the last element of the tuple along with the remaining elements as a new tuple.
3638
- [`TuplePushFront<T>`](https://docs.rs/tuplities-push-front/latest/tuplities_push_front/trait.TuplePushFront.html): Provides a [`push_front(element)`](https://docs.rs/tuplities-push-front/latest/tuplities_push_front/trait.TuplePushFront.html#tymethod.push_front) method to add an element to the front of the tuple, returning a new tuple.

tuplities-derive/src/lib.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ mod tuplities_insert;
1717
mod tuplities_last_tuple_row;
1818
mod tuplities_len;
1919
mod tuplities_mut;
20+
mod tuplities_mut_map;
2021
mod tuplities_option;
2122
mod tuplities_ord;
2223
mod tuplities_partial_eq;
@@ -26,6 +27,7 @@ mod tuplities_pop_front;
2627
mod tuplities_push_back;
2728
mod tuplities_push_front;
2829
mod tuplities_ref;
30+
mod tuplities_ref_map;
2931
mod tuplities_remove;
3032
mod tuplities_replicate;
3133
mod tuplities_reverse;
@@ -218,6 +220,22 @@ pub fn impl_tuple_mut(_attr: TokenStream, item: TokenStream) -> TokenStream {
218220
item.into()
219221
}
220222

223+
/// Generate `TupleRefMap` trait implementations for all tuple sizes.
224+
#[proc_macro_attribute]
225+
pub fn impl_tuple_ref_map(_attr: TokenStream, item: TokenStream) -> TokenStream {
226+
let mut item = proc_macro2::TokenStream::from(item);
227+
item.extend(tuplities_ref_map::impl_tuple_ref_map());
228+
item.into()
229+
}
230+
231+
/// Generate `TupleMutMap` trait implementations for all tuple sizes.
232+
#[proc_macro_attribute]
233+
pub fn impl_tuple_mut_map(_attr: TokenStream, item: TokenStream) -> TokenStream {
234+
let mut item = proc_macro2::TokenStream::from(item);
235+
item.extend(tuplities_mut_map::impl_tuple_mut_map());
236+
item.into()
237+
}
238+
221239
/// Generate `TupleOption` and `IntoTupleOption` trait implementations for all tuple sizes.
222240
#[proc_macro_attribute]
223241
pub fn impl_tuple_option(_attr: TokenStream, item: TokenStream) -> TokenStream {
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//! Submodule providing the derive macro for the `TupleMutMap` trait.
2+
3+
use quote::quote;
4+
5+
use crate::tuple_size::{generate_all_sizes, indices, type_params};
6+
7+
/// Generate `TupleMutMap` trait implementations for all tuple sizes.
8+
pub fn impl_tuple_mut_map() -> proc_macro2::TokenStream {
9+
generate_all_sizes(|size| {
10+
let type_params = type_params(size);
11+
let indices = indices(size);
12+
13+
quote! {
14+
impl<#(#type_params: TupleMut,)*> TupleMutMap for (#(#type_params,)*)
15+
{
16+
type MutMap<'a> = (#(< #type_params as TupleMut >::Mut<'a>,)*) where Self: 'a;
17+
18+
#[inline]
19+
fn tuple_mut_map(&mut self) -> Self::MutMap<'_> {
20+
(#(self.#indices.tuple_mut(),)*)
21+
}
22+
}
23+
}
24+
})
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//! Submodule providing the derive macro for the `TupleRefMap` trait.
2+
3+
use quote::quote;
4+
5+
use crate::tuple_size::{generate_all_sizes, indices, type_params};
6+
7+
/// Generate `TupleRefMap` trait implementations for all tuple sizes.
8+
pub fn impl_tuple_ref_map() -> proc_macro2::TokenStream {
9+
generate_all_sizes(|size| {
10+
let type_params = type_params(size);
11+
let indices = indices(size);
12+
13+
quote! {
14+
impl<#(#type_params: TupleRef,)*> TupleRefMap for (#(#type_params,)*)
15+
{
16+
type RefMap<'a> = (#(< #type_params as TupleRef >::Ref<'a>,)*) where Self: 'a;
17+
18+
#[inline]
19+
fn tuple_ref_map(&self) -> Self::RefMap<'_> {
20+
(#(self.#indices.tuple_ref(),)*)
21+
}
22+
}
23+
}
24+
})
25+
}

tuplities-mut/src/lib.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,30 @@ pub trait TupleMut {
4343
/// ```
4444
fn tuple_mut(&mut self) -> Self::Mut<'_>;
4545
}
46+
47+
#[tuplities_derive::impl_tuple_mut_map]
48+
/// A trait for applying `TupleMut` to each element of a tuple.
49+
///
50+
/// This trait takes a mutable reference to a tuple where each element implements `TupleMut` and returns
51+
/// a tuple where each element is the result of calling `tuple_mut()` on the original elements.
52+
///
53+
/// # Examples
54+
///
55+
/// ```rust
56+
/// use tuplities_mut::TupleMutMap;
57+
///
58+
/// let mut matrix = ((1, 2), (3, 4), (5, 6));
59+
/// let mut_ref_matrix = matrix.tuple_mut_map();
60+
/// assert_eq!(mut_ref_matrix, ((&mut 1, &mut 2), (&mut 3, &mut 4), (&mut 5, &mut 6)));
61+
/// ```
62+
///
63+
/// Part of the [`tuplities`](https://docs.rs/tuplities/latest/tuplities/) crate.
64+
pub trait TupleMutMap {
65+
/// The type of a tuple containing tuples of mutable references to each inner element.
66+
type MutMap<'a>
67+
where
68+
Self: 'a;
69+
70+
/// Returns a tuple where each element is a tuple of mutable references to the inner elements.
71+
fn tuple_mut_map(&mut self) -> Self::MutMap<'_>;
72+
}

tuplities-ref/src/lib.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,31 @@ pub trait TupleRef {
3838
/// ```
3939
fn tuple_ref(&self) -> Self::Ref<'_>;
4040
}
41+
42+
#[tuplities_derive::impl_tuple_ref_map]
43+
44+
/// A trait for applying `TupleRef` to each element of a tuple.
45+
///
46+
/// This trait takes a tuple where each element implements `TupleRef` and returns
47+
/// a tuple where each element is the result of calling `tuple_ref()` on the original elements.
48+
///
49+
/// # Examples
50+
///
51+
/// ```rust
52+
/// use tuplities_ref::TupleRefMap;
53+
///
54+
/// let matrix = ((1, 2), (3, 4), (5, 6));
55+
/// let ref_matrix = matrix.tuple_ref_map();
56+
/// assert_eq!(ref_matrix, ((&1, &2), (&3, &4), (&5, &6)));
57+
/// ```
58+
///
59+
/// Part of the [`tuplities`](https://docs.rs/tuplities/latest/tuplities/) crate.
60+
pub trait TupleRefMap {
61+
/// The type of a tuple containing tuples of references to each inner element.
62+
type RefMap<'a>
63+
where
64+
Self: 'a;
65+
66+
/// Returns a tuple where each element is a tuple of references to the inner elements.
67+
fn tuple_ref_map(&self) -> Self::RefMap<'_>;
68+
}

tuplities/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub mod prelude {
1414
pub use tuplities_insert::TupleInsert;
1515
pub use tuplities_len::{PairTuple, SingletonTuple, TupleLen, UnitTuple};
1616
pub use tuplities_mut::TupleMut;
17+
pub use tuplities_mut::TupleMutMap;
1718
pub use tuplities_option::{IntoTupleOption, TupleOption};
1819
pub use tuplities_ord::TupleOrd;
1920
pub use tuplities_partial_eq::TuplePartialEq;
@@ -23,6 +24,7 @@ pub mod prelude {
2324
pub use tuplities_push_back::TuplePushBack;
2425
pub use tuplities_push_front::TuplePushFront;
2526
pub use tuplities_ref::TupleRef;
27+
pub use tuplities_ref::TupleRefMap;
2628
pub use tuplities_remove::TupleRemove;
2729
pub use tuplities_replicate::TupleReplicate;
2830
pub use tuplities_reverse::TupleReverse;

0 commit comments

Comments
 (0)