Skip to content

Instantly share code, notes, and snippets.

@BenGoldberg1
Created November 3, 2015 04:12
Show Gist options
  • Save BenGoldberg1/7bbfde1a60b040cb3e2d to your computer and use it in GitHub Desktop.
Save BenGoldberg1/7bbfde1a60b040cb3e2d to your computer and use it in GitHub Desktop.
Cache::LRU
use v6;
class Cache::LRU {
has Hash[Node] %.entries;
has Node $.lru;
class Node {
has $value is required;
has $prev is rw;
has $next is rw;
method splice() {
return unless defined $next;
$next.prev = $prev;
$prev.next = $next;
$prev = $next = Nil;
}
method put-before-me(Node $newest) {
die if defined $newest.prev or defined $newest.next;
$newest.next = self;
$newest.prev = $.prev;
$.prev.next = $newest;
$.prev = $newest;
}
}
method _delete( $key ) {
my $node = %.entries{$key} :delete or return;
if $node === $lru {
if $node.next === $node {
$lru = Nil;
} else {
$lru = $lru.next;
}
}
return $node.splice;
}
method delete( $key ) {
my $node = _delete( $key );
return $node ? $node.value : Nil;
}
method set( $key, $value ) {
my $node = _delete( $key );
if $node {
$node.value = $value
} else {
$node = Node.new($:value)
}
if $lru {
$lru.put-before-me( $node );
} else {
$lru = $node;
}
$value;
}
method delete-lru() {
self._delete( $lru ) if defined $lru;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment