Data-HashMap
view release on metacpan or search on metacpan
# ---- Put refreshes TTL on update ----
{
my $m = Data::HashMap::II->new(0, 3);
hm_ii_put $m, 1, 10;
sleep 1;
# Re-put refreshes TTL
hm_ii_put $m, 1, 20;
sleep 2;
# 3 seconds since original put, but only 2 since refresh (TTL=3)
is(hm_ii_get $m, 1, 20, 'TTL: put refresh keeps entry alive');
}
# ---- Iteration skips expired entries ----
{
my $m = Data::HashMap::II->new(0, 1);
hm_ii_put $m, 1, 10;
hm_ii_put $m, 2, 20;
my @k = sort { $a <=> $b } (hm_ii_keys $m);
$map = Data::HashMap::IA->new();
is_deeply([hm_ia_keys $map], [], 'keys on empty map');
# refcount correctness â stored refs should survive
{
my $map2 = Data::HashMap::IA->new();
{
my @arr = (1, 2, 3);
hm_ia_put $map2, 1, \@arr;
}
# @arr is out of scope but refcount should keep it alive
my $ref = hm_ia_get $map2, 1;
is_deeply($ref, [1, 2, 3], 'ref survives scope exit');
}
# nested refs
{
my $map3 = Data::HashMap::IA->new();
my $complex = { list => [1, {deep => "value"}], num => 42 };
hm_ia_put $map3, 1, $complex;
my $got = hm_ia_get $map3, 1;
t/20-new-features.t view on Meta::CPAN
# put_ttl on map with default_ttl - per-key overrides default
{
my $m = Data::HashMap::II->new(0, 60);
hm_ii_put_ttl $m, 1, 10, 1;
hm_ii_put $m, 2, 20;
sleep 2;
my $v1 = hm_ii_get $m, 1;
is($v1, undef, 'II put_ttl overrides default TTL (expired)');
my $v2 = hm_ii_get $m, 2;
is($v2, 20, 'II default TTL still alive');
}
# put_ttl with LRU
{
my $m = Data::HashMap::II->new(10);
hm_ii_put_ttl $m, 1, 10, 1;
sleep 2;
my $v = hm_ii_get $m, 1;
is($v, undef, 'II put_ttl with LRU expired');
}
t/20-new-features.t view on Meta::CPAN
is(scalar @pairs, 4, 'IA drain: 2 pairs');
is(hm_ia_size $m, 1, 'IA drain: 1 remains');
is_deeply($pairs[1], [$pairs[0]], 'IA drain: value intact');
}
# drain respects TTL
{
my $m = Data::HashMap::II->new(0, 1);
hm_ii_put $m, $_, $_ for 1..5;
sleep 2;
hm_ii_put $m, 6, 6; # only this one is alive
my @pairs = hm_ii_drain $m, 100;
is(scalar @pairs, 2, 'II drain: only non-expired returned');
is($pairs[1], 6, 'II drain: correct value');
}
# ============================================================
# pop (LRU tail / iter forward) and shift (LRU head / iter backward)
# ============================================================
# LRU pop = take from tail (least recently used)
( run in 1.557 second using v1.01-cache-2.11-cpan-39bf76dae61 )