1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//! # keyed
//!
//! Make implementing key-based comparison a little bit easier. Usage:
//!
//! 1. Implement [`Key`](`Key`) trait for your type.
//! 2. Wrap your value in a [`Keyed`](`Keyed`) structure.
//!
//! Example:
//!
//! ```rust
//! use keyed::{Key, Keyed};
//!
//! #[derive(Debug)]
//! struct Item<T> {
//!     key: i32,
//!     value: T,
//! }
//!
//! impl<T> Key for Item<T> {
//!     type Output = i32;
//!
//!     fn key(&self) -> Self::Output {
//!         self.key
//!     }
//! }
//!
//! let lhs = Keyed(Item { key: 4, value: 3 });
//! let rhs = Keyed(Item { key: 4, value: 7 });
//!
//! assert_eq!(lhs, rhs);
//! ```
//!
//! If your key is a reference to internal data, you can use [`RefKey`](`RefKey`) trait and [`RefKeyed`](`RefKeyed`)
//! wrapper:
//!
//! ```rust
//! use keyed::{RefKey, RefKeyed};
//!
//! #[derive(Debug)]
//! struct Item<T> {
//!     key: i32,
//!     value: T,
//! }
//!
//! impl<T> RefKey for Item<T> {
//!     type Output = i32;
//!
//!     fn key(&self) -> &Self::Output {
//!         &self.key
//!     }
//! }
//!
//! let lhs = RefKeyed(Item { key: 4, value: 3 });
//! let rhs = RefKeyed(Item { key: 4, value: 7 });
//!
//! assert_eq!(lhs, rhs);
//! ```

#![no_std]
#![warn(clippy::cargo, clippy::pedantic)]

mod keyed;
mod ref_keyed;

pub use crate::keyed::Key;
pub use crate::keyed::Keyed;
pub use crate::ref_keyed::RefKey;
pub use crate::ref_keyed::RefKeyed;

#[cfg(test)]
mod tests;