56 lines
987 B
Perl
56 lines
987 B
Perl
package Entry;
|
|
|
|
use Moose;
|
|
|
|
use experimental qw/ signatures postderef /;
|
|
|
|
use List::AllUtils qw/ sum /;
|
|
|
|
has stream => (
|
|
is => 'ro',
|
|
required => 1,
|
|
traits => [ 'Array' ],
|
|
handles => {
|
|
splice => 'splice',
|
|
},
|
|
trigger => sub($self,$stream) {
|
|
my( $nchild, $ndata ) = splice @$stream, 0, 2;
|
|
$self->children([
|
|
map { Entry->new( stream => $stream ) } 1..$nchild
|
|
]);
|
|
$self->data([ splice @$stream, 0, $ndata ]);
|
|
}
|
|
);
|
|
|
|
has children => (
|
|
is => 'rw',
|
|
default => sub { [] },
|
|
);
|
|
|
|
has data => (
|
|
is => 'rw',
|
|
default => sub { [] },
|
|
);
|
|
|
|
sub all_data($self) {
|
|
return $self->data->@*, map {$_->all_data} $self->children->@*;
|
|
}
|
|
|
|
sub value($self) {
|
|
if( ! $self->children->@* ) {
|
|
return sum $self->data->@*
|
|
}
|
|
|
|
return sum
|
|
map { $_->value }
|
|
grep { $_ }
|
|
map { $self->children->[ $_ ] }
|
|
grep { $_ >= 0 }
|
|
map { $_ -1 }
|
|
$self->data->@*;
|
|
|
|
|
|
}
|
|
|
|
1;
|