Skip to content

Simple pattern for expressing Rust maps where the Value type contains the Key

Notifications You must be signed in to change notification settings

maackle/automap-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 

Repository files navigation

automap

Simple pattern to implement key-value maps where the value type contains the key type. Implementations for HashMap and BTreeMap from std::collections are provided.

Example

use std::collections::HashMap;
use automap::{AutoHashMap, AutoMapped};

// Let's say we want a `Person` to be keyed by their `name` in a HashMap
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
struct Person {
    name: String,
    age: u16,
}

// We can specify how to derive the key from the value
// As long as the Key type meets the bounds for a normal HashMap key, we
// can use this value in an AutoHashMap.
// (Similarly for BTreeMap.)
impl AutoMapped for Person {
    type Key = String;

    fn key(&self) -> &Self::Key {
        &self.name
    }
}

// Then, we can simply use an `AutoHashMap` to insert values directly.
let mut map = AutoHashMap::new();
let michelle = Person { name: "Michelle".into(), age: 37 };
// We don't need to provide the key, because it is derived from the value.
map.insert(michelle.clone());

// You can access all other normal HashMap methods directly:
assert_eq!(map.get("Michelle".into()), Some(&michelle));
assert_eq!(map.remove("Michelle".into()), Some(michelle));

// We can also go From and Into a normal HashMap easily.
let inner: HashMap<_, _> = map.into();
let map: AutoHashMap<_> = inner.into();

Serde support

Set the "serde" feature in your dependencies to include de/serialization support.

Future improvements

  • Avoid cloning the key: ideally, the key would be borrowed from the value, but it wasn't immediately apparent how to do this while still providing serde deserialization. Perhaps a bespoke data structure could be written instead of leaning on std::collections.
    • This could also be implemented with a proc macro which splits the target struct into the key part and the remainder, so that the key is only stored once while still using a standard Map.
  • Allow a value type to have multiple Automapped implementations, specifying different keys for different situations

About

Simple pattern for expressing Rust maps where the Value type contains the Key

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages