moonbitstack/moonstl/cache does not have a README file
test {
let cache : @cache.ArcCache[String, Int32] = @cache.ArcCache::new(capacity=2)
let _ = cache.set("a", 1)
let _ = cache.set("b", 2)
let _ = cache.get("a")
let _ = cache.set("c", 3)
let (t1, t2, b1, b2) = cache.lists()
@test.assert_eq(t1 + t2, 2)
@test.assert_eq(b1 + b2 <= 2, true)
}pub struct ArcNode[K, V] {
key : K
value : V?
list : Int
prev : Int
next : Int
}impl Show for CacheStatstest {
let stats : @cache.CacheStats = { hits: 3, misses: 1, evictions: 0, }
@test.assert_eq(stats.hit_rate(), 0.75)
}pub struct ExpNode[K, V] {
key : K
value : V
expire_at : Int64
stamp : Int
prev : Int
next : Int
}test {
let mut clock : Int64 = 0L
let cache : @cache.ExpiringCache[String, Int32] = @cache.ExpiringCache::new(
ttl=10L,
capacity=2,
now=() => clock,
)
let _ = cache.set("a", 1)
@test.assert_eq(cache.get("a"), Some(1))
clock = 11L
@test.assert_eq(cache.get("a"), None)
}impl Show for ExpiringCache[K, V]fn[K, V] ExpiringCache::new(ttl~ : Int64, capacity~ : Int, now~ : () -> Int64, hash_seed? : Int) -> ExpiringCache[K, V] raise Refusedfn[K : Hash + Eq + Show, V : Show] ExpiringCache::output(self : ExpiringCache[K, V], logger : &Logger) -> Unitfn[K : Hash + Eq, V] ExpiringCache::set(self : ExpiringCache[K, V], key : K, value : V, ttl? : Int64) -> (K, V)?fn[K : Hash + Eq, V] ExpiringCache::set_expire(self : ExpiringCache[K, V], key : K, at : Int64) -> Boolpub struct LfuBucket {
head : Int
tail : Int
}test {
let cache : @cache.LfuCache[String, Int32] = @cache.LfuCache::new(capacity=2)
let _ = cache.set("a", 1)
let _ = cache.set("b", 2)
let _ = cache.get("a")
let _ = cache.set("c", 3)
@test.assert_eq(cache.get("b"), None)
@test.assert_eq(cache.frequency("a"), Some(2))
}pub struct LfuNode[K, V] {
key : K
value : V
freq : Int
prev : Int
next : Int
}test {
let cache : @cache.LruCache[String, Int32] = @cache.LruCache::new(capacity=2)
let _ = cache.set("a", 1)
let _ = cache.set("b", 2)
let _ = cache.get("a")
let _ = cache.set("c", 3)
@test.assert_eq(cache.get("b"), None)
@test.assert_eq(cache.get("a"), Some(1))
}test {
let cache : @cache.LruCache[Int32, String] = @cache.LruCache::new(capacity=1)
let _ = cache.set(1, "one")
@test.assert_eq(cache.get(1), Some("one"))
@test.assert_eq(cache.get(2), None)
@test.assert_eq(cache.stats().misses, 1L)
}test {
let cache : @cache.LruCache[String, Int32] = @cache.LruCache::new(capacity=1)
@test.assert_eq(cache.set("a", 1), None)
@test.assert_eq(cache.set("b", 2), Some(("a", 1)))
@test.assert_eq(cache.set("b", 3), Some(("b", 2)))
}pub struct LruNode[K, V] {
key : K
value : V
prev : Int
next : Int
}test {
let mut calls = 0
let square : (Int32) -> Int32 = @cache.memoize(
key => {
calls += 1
key * key
},
capacity=8,
)
@test.assert_eq(square(4), 16)
@test.assert_eq(square(4), 16)
@test.assert_eq(calls, 1)
}Install
Download zipData structures and algorithms the MoonBit core library leaves out.