package xFeatures;
use strict;
use warnings;
use xKey;

sub new {
   my $self = {
      __name => [],
      __features => {
#feature => function(\@xKey_keys,num_keys)
         total=>\&total,
         PP=>\&press_press,
         RR=>\&release_release,
         PR=>\&press_release,
         duration=>\&duration,
#add any custom features here
      }
   };
   bless $self,'xFeatures';
   return $self;
}

sub list_features {
   my ($self)=@_;
   my $str="";
   foreach my $f (sort(keys %{$self->{__features}})) {
      $str.="$f, ";
   }
   return $str;
}

sub get_features {
   my ($self,$keys,$len)=@_;
   my %feat=();
   foreach my $f (sort(keys %{$self->{__features}})) {
      $feat{$f}=join(",",&{$self->{__features}{$f}}($keys,$len));
   }
   return %feat;
}

# ###########################################################################

sub total {
   my ($keys,$len)=@_;
   if($len>0) { 
      return $keys->[$len-1]->r-$keys->[0]->p; 
   }
   return -1;
}

# Press(i)-Press(i-1)
sub press_press {
   my ($keys,$len)=@_;
   my @ret;
   for(my $i=1;$i<$len;$i++) {
      push(@ret,$keys->[$i]->p-$keys->[$i-1]->p); 
   }
   return @ret;
}

# Release(i)-Release(i-1)
sub release_release {
   my ($keys,$len)=@_;
   my @ret;
   for(my $i=1;$i<$len;$i++) {
      push(@ret,$keys->[$i]->r-$keys->[$i-1]->r); 
   }
   return @ret;
}

# Press(i)-Release(i-1)
sub press_release {
   my ($keys,$len)=@_;
   my @ret;
   for(my $i=1;$i<$len;$i++) {
      push(@ret,$keys->[$i]->p-$keys->[$i-1]->r); 
   }
   return @ret;
}

# Release(i)-Press(i)
sub duration {
   my ($keys,$len)=@_;
   my @ret;
   for(my $i=0;$i<$len;$i++) {
      push(@ret,$keys->[$i]->r-$keys->[$i]->p); 
   }
   return @ret;
}



1;

