ord-by-set
A library providing a weakly ordered multi-set with compile-time configurable ordering scheme.
When To Use This
- When you want a
BTreeSetbut your data involves partial/loose equivelance, and you want to be able to perform efficient retrievals of multiple values of loose equivelance. - When you have ordered keys stored in the same type as the values, allowing
a
BTreeMap-like data structure but with inline keys.- This is done by using a custom
Orderimplementation in order to order types by the fields being used as keys, without a reliance on being totally ordered
- This is done by using a custom
- When you want a multi-{set, map} but hashing is not an option
When Not To Use This
- In place of
HashMap/HashSet/BTreeMap/BTreeSetwhen you don't need multiple loosely equivelant values.
Overview
An OrdBySet is composed of two parts: its storage backing (a sorted Vec<T>)
and a user-provided orderer. An orderer is a value which can take two items and
loosely compare them. This is done via the Order<T> trait, which requires a
single method, Order::order_of:
;
Unlike Ord, however, this is not guaranteed to be totally ordered, and as
such it can be used in such a manner that groups loosely-equivelant values, similarly
to how a Bag datastructure allows for storing multiple of the same value.
The differentiating feature, however, is that one can then proceed to query all losely equivelant types[^1]. The ordering scheme.
[^1]: One example being that you might want a query of 3 to turn up both 3 as an
integer and 3 as a string, while still storing both the string and the integer.
For more info on this see Order's docs.
Example
use OrdBySet;
// Our orderer will be a simple function that sorts based on the first 5 characters
let ordering_fn = ;
let set = new_with_order
.with_items;
let id_1_subset = set.get.unwrap;
// id_1_subset = unordered(["00001_foo", "00001_bar"])
assert_eq!;
assert!;
assert!;
While the above uses a closure for the orderer, it can be any type if you implement
Order<T>. Typically this is done via a zero-sized type as usually state is not
needed by the ordering mechanism, just behavior:
use ;
use Ordering;
;
type AllEqualSet = ;
let mut set = new.with_items;
assert_eq!;
set.remove_all;
assert!;