File Coverage

blib/lib/Sort/BySimilarity.pm
Criterion Covered Total %
statement 14 31 45.1
branch 0 8 0.0
condition 0 2 0.0
subroutine 5 8 62.5
pod 2 2 100.0
total 21 51 41.1


line stmt bran cond sub pod time code
1             package Sort::BySimilarity;
2              
3 1     1   317853 use 5.010001;
  1         3  
4 1     1   5 use strict;
  1         2  
  1         26  
5 1     1   3 use warnings;
  1         2  
  1         91  
6              
7 1     1   5 use Exporter qw(import);
  1         1  
  1         33  
8 1     1   536 use Text::Levenshtein::XS;
  1         850  
  1         360  
9              
10             our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
11             our $DATE = '2024-01-19'; # DATE
12             our $DIST = 'Sort-BySimilarity'; # DIST
13             our $VERSION = '0.002'; # VERSION
14              
15             our @EXPORT_OK = qw(
16             gen_sorter_by_similarity
17             sort_by_similarity
18             );
19             #gen_cmp_by_similarity
20              
21             sub gen_sorter_by_similarity {
22 0     0 1   my ($is_reverse, $is_ci, $args) = @_;
23 0   0       $args //= {};
24              
25             sub {
26 0     0     my @items = @_;
27 0           my @distances;
28 0 0         if ($is_ci) {
29 0           @distances = map { Text::Levenshtein::XS::distance($args->{string}, $_) } @items;
  0            
30             } else {
31 0           @distances = map { Text::Levenshtein::XS::distance(lc($args->{string}), (lc $_)) } @items;
  0            
32             }
33              
34 0           map { $items[$_] } sort {
35 0 0         ($is_reverse ? $distances[$b] <=> $distances[$a] : $distances[$a] <=> $distances[$b]) ||
  0 0          
    0          
36             ($is_reverse ? $b <=> $a : $a <=> $b)
37             } 0 .. $#items;
38 0           };
39             }
40              
41             sub sort_by_similarity {
42 0     0 1   my $is_reverse = shift;
43 0           my $is_ci = shift;
44 0           my $args = shift;
45 0           gen_sorter_by_similarity($is_reverse, $is_ci, $args)->(@_);
46             }
47              
48             1;
49             # ABSTRACT: Sort by most similar to a reference string
50              
51             __END__