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;