File Coverage

blib/lib/List/Rank.pm
Criterion Covered Total %
statement 136 136 100.0
branch 24 24 100.0
condition n/a
subroutine 11 11 100.0
pod 6 6 100.0
total 177 177 100.0


line stmt bran cond sub pod time code
1             package List::Rank;
2              
3 2     2   357167 use strict;
  2         4  
  2         75  
4 2     2   14 use warnings;
  2         4  
  2         137  
5              
6 2     2   10 use Exporter qw(import);
  2         3  
  2         1075  
7              
8             our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
9             our $DATE = '2023-11-23'; # DATE
10             our $DIST = 'List-Rank'; # DIST
11             our $VERSION = '0.004'; # VERSION
12              
13             our @EXPORT_OK = qw(rank rankstr rankby sortrank sortrankstr sortrankby);
14              
15             sub rank(@) { ## no critic: Subroutines::ProhibitSubroutinePrototypes
16 3     3 1 519529 my @ary;
17 3         6 my $i = 0;
18 3         10 for (@_) { push @ary, [$_, $i++, undef] }
  5         14  
19 3         10 @ary = sort { $a->[0] <=> $b->[0] } @ary;
  5         12  
20 3         6 my $j = 1;
21 3         12 for ($i=0; $i<@ary; $i++) {
22 5 100       12 if ($i == 0) {
23 2         7 $ary[$i][2] = $j;
24             } else {
25 3 100       11 if ($ary[$i-1][0] == $ary[$i][0]) {
26 1         5 $ary[$i-1][2] = $ary[$i][2] = "$j=";
27             } else {
28 2         4 $j = $i+1;
29 2         6 $ary[$i][2] = $j;
30             }
31             }
32             }
33 3         14 map { $_->[2] } sort { $a->[1] <=> $b->[1] } @ary;
  5         24  
  5         10  
34             }
35              
36             sub rankstr(@) { ## no critic: Subroutines::ProhibitSubroutinePrototypes
37 3     3 1 4807 my @ary;
38 3         6 my $i = 0;
39 3         17 for (@_) { push @ary, [$_, $i++, undef] }
  5         16  
40 3         10 @ary = sort { $a->[0] cmp $b->[0] } @ary;
  5         12  
41 3         6 my $j = 1;
42 3         13 for ($i=0; $i<@ary; $i++) {
43 5 100       12 if ($i == 0) {
44 2         7 $ary[$i][2] = $j;
45             } else {
46 3 100       11 if ($ary[$i-1][0] eq $ary[$i][0]) {
47 1         5 $ary[$i-1][2] = $ary[$i][2] = "$j=";
48             } else {
49 2         4 $j = $i+1;
50 2         6 $ary[$i][2] = $j;
51             }
52             }
53             }
54 3         12 map { $_->[2] } sort { $a->[1] <=> $b->[1] } @ary;
  5         23  
  5         11  
55             }
56              
57             sub rankby(&;@) { ## no critic: Subroutines::ProhibitSubroutinePrototypes
58 2     2   41 no strict 'refs'; ## no critic: TestingAndDebugging::ProhibitNoStrict
  2         6  
  2         1433  
59              
60 3     3 1 4374 my $cmp = shift;
61              
62 3         8 my $caller = caller();
63              
64 3         7 my @ary;
65 3         5 my $i = 0;
66 3         7 for (@_) { push @ary, [$_, $i++, undef] }
  5         15  
67             @ary = sort {
68 3         9 local ${"$caller\::a"} = $a->[0];
  4         14  
  4         12  
69 4         7 local ${"$caller\::b"} = $b->[0];
  4         10  
70 4         9 $cmp->();
71             } @ary;
72 3         10 my $j = 1;
73 3         11 for ($i=0; $i<@ary; $i++) {
74 5 100       12 if ($i == 0) {
75 2         7 $ary[$i][2] = $j;
76             } else {
77 3 100       5 if (do {
78 3         7 local ${"$caller\::a"} = $ary[$i-1][0];
  3         8  
79 3         5 local ${"$caller\::b"} = $ary[$i][0];
  3         8  
80 3         7 !$cmp->();
81             }) {
82 1         11 $ary[$i-1][2] = $ary[$i][2] = "$j=";
83             } else {
84 2         35 $j = $i+1;
85 2         17 $ary[$i][2] = $j;
86             }
87             }
88             }
89 3         13 map { $_->[2] } sort { $a->[1] <=> $b->[1] } @ary;
  5         22  
  4         10  
90             }
91              
92             sub sortrank(@) { ## no critic: Subroutines::ProhibitSubroutinePrototypes
93 3     3 1 4527 my @ary;
94 3         7 my $i = 0;
95 3         7 for (@_) { push @ary, [$_, $i++, undef] }
  5         14  
96 3         10 @ary = sort { $a->[0] <=> $b->[0] } @ary;
  5         12  
97 3         5 my $j = 1;
98 3         11 for ($i=0; $i<@ary; $i++) {
99 5 100       16 if ($i == 0) {
100 2         6 $ary[$i][2] = $j;
101             } else {
102 3 100       10 if ($ary[$i-1][0] == $ary[$i][0]) {
103 1         6 $ary[$i-1][2] = $ary[$i][2] = "$j=";
104             } else {
105 2         4 $j = $i+1;
106 2         21 $ary[$i][2] = $j;
107             }
108             }
109             }
110 3         11 map { ($_->[0], $_->[2]) } @ary;
  5         25  
111             }
112              
113             sub sortrankstr(@) { ## no critic: Subroutines::ProhibitSubroutinePrototypes
114 3     3 1 4363 my @ary;
115 3         7 my $i = 0;
116 3         7 for (@_) { push @ary, [$_, $i++, undef] }
  5         15  
117 3         11 @ary = sort { $a->[0] cmp $b->[0] } @ary;
  5         12  
118 3         4 my $j = 1;
119 3         11 for ($i=0; $i<@ary; $i++) {
120 5 100       12 if ($i == 0) {
121 2         7 $ary[$i][2] = $j;
122             } else {
123 3 100       10 if ($ary[$i-1][0] eq $ary[$i][0]) {
124 1         6 $ary[$i-1][2] = $ary[$i][2] = "$j=";
125             } else {
126 2         5 $j = $i+1;
127 2         6 $ary[$i][2] = $j;
128             }
129             }
130             }
131 3         11 map { ($_->[0], $_->[2]) } @ary;
  5         24  
132             }
133              
134             sub sortrankby(&;@) { ## no critic: Subroutines::ProhibitSubroutinePrototypes
135 2     2   14 no strict 'refs'; ## no critic: TestingAndDebugging::ProhibitNoStrict
  2         4  
  2         643  
136              
137 3     3 1 4947 my $cmp = shift;
138              
139 3         10 my $caller = caller();
140              
141 3         6 my @ary;
142 3         4 my $i = 0;
143 3         8 for (@_) { push @ary, [$_, $i++, undef] }
  5         15  
144             @ary = sort {
145 3         10 local ${"$caller\::a"} = $a->[0];
  4         14  
  4         13  
146 4         8 local ${"$caller\::b"} = $b->[0];
  4         9  
147 4         9 $cmp->();
148             } @ary;
149 3         9 my $j = 1;
150 3         11 for ($i=0; $i<@ary; $i++) {
151 5 100       15 if ($i == 0) {
152 2         8 $ary[$i][2] = $j;
153             } else {
154 3 100       6 if (do {
155 3         7 local ${"$caller\::a"} = $ary[$i-1][0];
  3         8  
156 3         7 local ${"$caller\::b"} = $ary[$i][0];
  3         7  
157 3         8 !$cmp->();
158             }) {
159 1         11 $ary[$i-1][2] = $ary[$i][2] = "$j=";
160             } else {
161 2         9 $j = $i+1;
162 2         7 $ary[$i][2] = $j;
163             }
164             }
165             }
166 3         11 map { ($_->[0], $_->[2]) } @ary;
  5         26  
167             }
168              
169             1;
170             # ABSTRACT: Ranking of list elements
171              
172             __END__