Crates.io | lending-library |
lib.rs | lending-library |
version | 0.2.0 |
source | src |
created_at | 2018-04-20 14:00:46.123405 |
updated_at | 2019-03-19 17:07:03.795942 |
description | A key-value store that loans full ownership of items. |
homepage | |
repository | https://github.com/HarkonenBade/lending-library |
max_upload_size | |
id | 61582 |
size | 29,097 |
A data store that lends temporary ownership of stored values.
This allows for access and/or mutation of independent keys in the store simultaneously.
use lending_library::*;
struct Processor;
struct Item(String);
impl Item {
fn gen(dat: &str) -> Self { Item(dat.to_string()) }
}
impl Processor {
fn link(&self, _first: &Item, _second: &Item) {}
}
enum Event {
Foo {
id: i64,
dat: &'static str,
},
Bar {
id: i64,
o_id: i64,
o_dat: &'static str,
}
}
const EVTS: &[Event] = &[Event::Foo {id:1, dat:"a_val"},
Event::Foo {id:2, dat:"b_val"},
Event::Bar {id:1, o_id: 2, o_dat:"B_val"},
Event::Bar {id:1, o_id: 3, o_dat:"c_val"}];
struct Store {
id_gen: Box<Iterator<Item = i64>>,
id_to_dat: LendingLibrary<i64, Item>,
}
impl Store {
fn new() -> Self {
Store {
id_gen: Box::new(0..),
id_to_dat: LendingLibrary::new(),
}
}
pub fn declare(&mut self, uid: i64, dat: &str) -> Loan<i64, Item> {
if !self.id_to_dat.contains_key(&uid) {
self.id_to_dat.insert(uid, Item::gen(dat));
}
self.id_to_dat.lend(&uid).unwrap()
}
}
fn main() {
let mut store = Store::new();
let pro = Processor;
for evt in EVTS {
match *evt {
Event::Foo { id, dat } => {
store.declare(id, dat);
}
Event::Bar { id, o_id, o_dat } => {
let i = store.declare(id, "");
let o = store.declare(o_id, o_dat);
pro.link(&i, &o);
}
}
}
}