@@ -11,11 +11,9 @@ use PDL::Lite (); # PDL::Lite is the minimal to get PDL work
11
11
use PDL::Core qw( pdl) ;
12
12
use PDL::Primitive qw( which) ;
13
13
14
- use Data::Rmap qw( rmap) ;
15
14
use Module::Load;
16
15
use Ref::Util qw( is_plain_arrayref) ;
17
16
use Safe::Isa;
18
- use Storable qw( dclone) ;
19
17
use Scalar::Util qw( blessed) ;
20
18
use Type::Params;
21
19
use Types::Standard qw( slurpy ArrayRef ConsumerOf Int) ;
@@ -99,21 +97,28 @@ sub new {
99
97
return $data -> copy;
100
98
}
101
99
100
+ # TODO: this does not support ND piddle yet.
101
+
102
102
# reorder levels
103
103
my @levels = @{ delete $opt {levels } };
104
104
my @integer_old = $data -> {PDL }-> list;
105
- my $i = 0;
106
- my %levels_old = map { $i ++ => $_ } @{ $data -> levels };
107
- $i = 0;
108
- my %levels_new = map { $_ => $i ++ } @levels ;
109
- my @integer_new = map {
110
- my $enum = $levels_old {$_ };
111
- defined $enum ? $levels_new {$enum } : -1;
112
- } @integer_old ;
113
-
114
- my $new = $class -> new( \@levels , levels => \@levels , %opt );
105
+ my @levels_old = @{ $data -> levels };
106
+ my %levels_new = do {
107
+ my $i = 0;
108
+ map { $_ => $i ++ } @levels ;
109
+ };
110
+ my @integer_new = do {
111
+ no warnings ' numeric' ;
112
+ map {
113
+ my $level = $levels_old [$_ ];
114
+ defined $level ? $levels_new {$level } : -1;
115
+ } @integer_old ;
116
+ };
117
+
118
+ my $new = $class -> new( [ $levels [0] ], levels => \@levels , %opt );
115
119
my $p = PDL::Core::indx( \@integer_new );
116
- $new -> {PDL } = $p -> setbadif( $p < 0 );
120
+ $p = $p -> setbadif( $data -> isbad ) if $data -> badflag;
121
+ $new -> {PDL } = $p ;
117
122
return $new ;
118
123
}
119
124
@@ -132,12 +137,20 @@ sub new {
132
137
$levels = $class -> _extract_levels($enum );
133
138
}
134
139
135
- $enum = $enum -> $_DOES(' PDL' ) ? $enum -> unpdl : dclone($enum );
136
- my $i = 0;
137
- my %levels = map { $_ => $i ++; } @$levels ;
138
- rmap {
139
- $_ = ($levels {$_ } // -1); # assign index of level
140
- } $enum ;
140
+ # this is faster than Data::Rmap::rmap().
141
+ state $rmap = sub {
142
+ my ( $x , $levels ) = @_ ;
143
+ is_plain_arrayref($x )
144
+ ? [ map { __SUB__ -> ( $_ , $levels ) } @$x ]
145
+ : ( $levels -> {$x } // -1 );
146
+ };
147
+
148
+ my %levels = do {
149
+ my $i = 0;
150
+ map { $_ => $i ++; } @$levels ;
151
+ };
152
+ $enum =
153
+ $rmap -> ( ( $enum -> $_DOES(' PDL' ) ? $enum -> unpdl : $enum ), \%levels );
141
154
142
155
my $self = $class -> initialize();
143
156
0 commit comments