#hash-map #key-value #key-value-store #order #pair #ordered #hybrid

hashvec

A HashMap/Vector hybrid: efficient, ordered key-value data storage

7 releases

0.1.6 May 16, 2022
0.1.5 May 16, 2022

#2363 in Algorithms

MIT license

19KB
225 lines

hashvec

A HashVec is a hash map / dictionary whose key-value pairs are stored (and can be iterated over) in a fixed order, by default the order in which they were inserted into the map. It's essentially a vector whose values can be inserted/retrieved with keys.

Example

use hashvec::*;

// Create a new hashvec containing pairs of animal names and species
// The hashvec! macro acts like vec!, but with key-value tuple pairs
let mut hashvec: HashVec<&'static str, &'static str> = hashvec![
    ("Doug", "Kobold"),
    ("Skye", "Hyena"),
    ("Lee", "Shiba"),
    ("Sock", "Man"),
    ("Salad", "Wolf"),
    ("Finn", "Human")
];

// Insert a value into the hashvec (HashMap-style)
// Inserting overwrites existing keys' entries in-place
hashvec.insert("Jake", "Dog");

// Push a value onto the hashvec (Vector-style)
// Pushing overwrites existing keys' entries and moves them to the end
hashvec.push(("Susie", "Squid"));

// Access a value by key
match hashvec.get(&"Finn") {
    Some(value) => {
        assert_eq!(*value, "Human");
    },
    None => {}
}

// Access an entry by index
let lee_value = hashvec[2];
assert_eq!(lee_value, ("Lee", "Shiba"));

// Get the index of a key
let lee_index = hashvec.index(&"Lee").unwrap();
assert_eq!(lee_index, 2);

// Get the length of the hashvec
let hashvec_length = hashvec.len();
assert_eq!(hashvec_length, 8);

// Change an entry's key in-place
hashvec.rename(&"Salad", "Caesar");
assert_eq!(hashvec[4], ("Caesar", "Wolf"));

// Mutate a value
match hashvec.get_mut(&"Sock") {
    Some(value) => {
        *value = "Guinea Pig";
    },
    None => {}
}
assert_eq!(*hashvec.get(&"Sock").unwrap(), "Guinea Pig");

// Remove an entry
hashvec.remove_key(&"Doug");
assert_eq!(hashvec.get(&"Doug"), None);

// Swap the locations of two entries by their keys
hashvec.swap_keys(&"Lee", &"Skye");
assert_eq!(hashvec.index(&"Lee").unwrap(), 0);
assert_eq!(hashvec.index(&"Skye").unwrap(), 1);

// Now swap them again, by their indices
hashvec.swap_indices(0, 1);
assert_eq!(hashvec[0], ("Skye", "Hyena"));
assert_eq!(hashvec[1], ("Lee", "Shiba"));

// Iterate over each of the key-value pairs in the hashvec
for (k, v) in hashvec.into_iter() {
    println!("{} is a {}!", k, v);
}

// Remove an entry from the end of the hashvec
let last_entry = hashvec.pop();
assert_eq!(last_entry.unwrap(), ("Susie", "Squid"));

// Clear the hashvec
hashvec.clear();

No runtime deps