#mutable #reference #mut #split #ref #multiple-values

splitmut

Safely retrieves multiple mutable values from the same collection

2 unstable releases

Uses old Rust 2015

0.2.1 Feb 27, 2018
0.1.1 Feb 5, 2016
0.1.0 Feb 4, 2016

#1985 in Rust patterns

Download history 5269/week @ 2024-03-24 7720/week @ 2024-03-31 6913/week @ 2024-04-07 7626/week @ 2024-04-14 8873/week @ 2024-04-21 5761/week @ 2024-04-28 10435/week @ 2024-05-05 12711/week @ 2024-05-12 9074/week @ 2024-05-19 11355/week @ 2024-05-26 14088/week @ 2024-06-02 9194/week @ 2024-06-09 9689/week @ 2024-06-16 10525/week @ 2024-06-23 10503/week @ 2024-06-30 15517/week @ 2024-07-07

46,533 downloads per month
Used in 18 crates (2 directly)

Apache-2.0/MIT

17KB
199 lines

SplitMut

A Rust library for safely retrieving multiple mutable values within the same collection.

API Documentation Crates.io

get2_mut, get3_mut and get4_mut return a tuple or 2, 3 or 4 values, each one of them being one of:

  • Ok(&mut V)
  • Err(SplitMutError::NoValue) in case there was no value for the key (i e, when your usual get_mut would have returned None)
  • Err(SplitMutError::SameValue) in case the same value has already been returned earlier in the tuple.

Add use splitmut::SplitMut to your code have these functions implemented for mutable slices, Vec, VecDeque, HashMap and BTreeMap.

Example

extern crate splitmut;

use std::collections::HashMap;
use splitmut::{SplitMut, SplitMutError};

// Create a hashmap
let mut h = HashMap::new();
h.insert(1, "Hello");
h.insert(2, "world");

// Swap two values easily
{
    let (m1, m2) = h.get2_mut(&1, &2);
    std::mem::swap(m1.unwrap(), m2.unwrap());
}
assert_eq!(h.get(&1), Some(&"world"));
assert_eq!(h.get(&2), Some(&"Hello"));

// Show error handling
let (m0, m1a, m1b) = h.get3_mut(&0, &1, &1);
// No value for the key "0"
assert_eq!(m0, Err(SplitMutError::NoValue));
// First value for the key "1" is returned successfully
assert_eq!(m1a, Ok(&mut "world"));
// Second value for the key "1" returns an error
assert_eq!(m1b, Err(SplitMutError::SameValue));

No runtime deps