CacherRs
![Latest Version]

usage
- sync cacher
```rust
use cacher_rs::{Cacher};
let mut i32cacher = Cacher::::new();
// expiresinsecs: 0 -> expires immediate
let v1 = i32cacher.fetch("v1", 10, || 1);
assert_eq!(v1, &1);
let mut stringcacher = Cacher::::new();
let v1 = stringcacher.fetch("v1", 10, || "1".tostring());
asserteq!(v1, "1");
```
- async cacher
```rust
use cacher_rs::{AsyncCacher};
let mut i32cacher = AsyncCacher::::new();
// expiresinsecs: 0 -> expires immediate
let v1 = i32cacher.fetch("v1", 10, || Box::pin(async {
Ok(1)
})).await?;
assert_eq!(v1, &1);
let mut stringcacher = AsyncCacher::::new();
let v1 = stringcacher.fetch("v1", 10, || Box::pin(async {
Ok("1".tostring())
})).await?;
asserteq!(v1, "1");
```
methods
[async] fetch(key, value, closure)
return cache value if not expires or recalculate closure value
[async] force_fetch(key, value, closure)
force recalculate closure value
[async] read(key)
return key cache value if cache exists
write(key, value)
overwrite cache value and expiration time if cache exists
expire(key)
make cache value expired if cache exists
delete(key)
remove cache if cache exists