Skip to content

Instantly share code, notes, and snippets.

@xiaocang
Created April 6, 2016 14:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xiaocang/94f4ab574f7a2a1cbd46df188238fb0c to your computer and use it in GitHub Desktop.
Save xiaocang/94f4ab574f7a2a1cbd46df188238fb0c to your computer and use it in GitHub Desktop.
Trie Folder
package Folder;
use Moo;
has trie => (
is => 'rw',
isa => sub { die "$_[0] is not a Trie Obj!" unless ref $_[0] eq "Trie" },
default => sub { Trie->new() }
);
sub read {
my $self = shift;
my $path = shift;
my (undef, @path_arr) = split("/", $path);
unshift @path_arr, ".";
my $trie_ref = $self->trie;
$trie_ref = $trie_ref->walk($_) for @path_arr;
return $trie_ref->version();
}
sub write {
my $self = shift;
my ($path, $num) = @_;
my (undef, @path_arr) = split("/", $path);
unshift @path_arr, ".";
my $trie_ref = $self->trie;
$trie_ref = $trie_ref->walk($_) for @path_arr;
return $trie_ref->inc($num || 1);
}
1;
package Trie;
use Moo;
has data => (is => 'rw', default => sub { +{ "." => {"/b" => 0} } });
sub walk {
my $self = shift;
my $c = shift;
my $previous = $self->data->{"/v"} || 0;
$self->{data}{$c} ||= { "/b" => 0 };
$self->{data}{$c}{"/v"} = $self->{data}{$c}{"/b"} + $previous;
return Trie->new(data => $self->{data}{$c});
}
sub version { shift->data->{"/v"} }
sub inc { $_[0]->data->{"/b"} += $_[1] }
1;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment