File Coverage

blib/lib/Complete/Number.pm
Criterion Covered Total %
statement 11 11 100.0
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 15 15 100.0


line stmt bran cond sub pod time code
1             package Complete::Number;
2              
3             our $DATE = '2015-11-29'; # DATE
4             our $VERSION = '0.04'; # VERSION
5              
6 1     1   648 use 5.010001;
  1         3  
7 1     1   5 use strict;
  1         1  
  1         19  
8 1     1   5 use warnings;
  1         1  
  1         30  
9             #use experimental 'smartmatch';
10             #use Log::Any::IfLOG '$log';
11              
12 1     1   860 use Complete::Common qw(:all);
  1         520  
  1         1565  
13              
14             require Exporter;
15             our @ISA = qw(Exporter);
16             our @EXPORT_OK = qw(
17             complete_int
18             complete_float
19             );
20             our %SPEC;
21              
22             $SPEC{':package'} = {
23             v => 1.1,
24             summary => 'Complete numbers',
25             };
26              
27             $SPEC{complete_int} = {
28             v => 1.1,
29             summary => 'Complete integer number',
30             args => {
31             %arg_word,
32             max => { schema=>['int'] },
33             min => { schema=>['int'] },
34             xmax => { schema=>['int'] },
35             xmin => { schema=>['int'] },
36             },
37             result_naked => 1,
38             result => {
39             schema => 'array',
40             },
41             };
42             sub complete_int {
43             require Complete::Util;
44              
45             my %args = @_;
46             my $word = $args{word} // "";
47              
48             my @words;
49              
50             my $limit = 100;
51             if(defined($args{min}) && defined($args{max}) &&
52             $args{max}-$args{min} <= $limit) {
53             push @words, $args{min} .. $args{max};
54             } elsif (defined($args{min}) && defined($args{xmax}) &&
55             $args{xmax}-$args{min} <= $limit) {
56             push @words, $args{min} .. $args{xmax}-1;
57             } elsif (defined($args{xmin}) && defined($args{max}) &&
58             $args{max}-$args{xmin} <= $limit) {
59             push @words, $args{xmin}+1 .. $args{max};
60             } elsif (defined($args{xmin}) && defined($args{xmax}) &&
61             $args{xmax}-$args{xmin} <= $limit) {
62             push @words, $args{xmin}+1 .. $args{xmax}-1;
63             } elsif (length($word) && $word !~ /\A-?\d*\z/) {
64             # warn: not an int
65             } else {
66             # do a digit by digit completion
67             my @signs = ("");
68             push @signs, "-" if $word =~ /\A-|\A\z/;
69             for my $sign (@signs) {
70             for ("", 0..9) {
71             my $i = $sign . $word . $_;
72             next unless length $i;
73             next unless $i =~ /\A-?\d+\z/;
74             next if $i eq '-0';
75             next if $i =~ /\A-?0\d/;
76             next if defined($args{min} ) && $i < $args{min};
77             next if defined($args{xmin}) && $i <= $args{xmin};
78             next if defined($args{max} ) && $i > $args{max};
79             next if defined($args{xmin}) && $i >= $args{xmax};
80             push @words, $i;
81             }
82             }
83             }
84              
85             Complete::Util::complete_array_elem(array=>\@words, word=>$word);
86             }
87              
88             $SPEC{complete_float} = {
89             v => 1.1,
90             summary => 'Complete floating number',
91             args => {
92             %arg_word,
93             max => { schema=>['float'] },
94             min => { schema=>['float'] },
95             xmax => { schema=>['float'] },
96             xmin => { schema=>['float'] },
97             },
98             result_naked => 1,
99             result => {
100             schema => 'array',
101             },
102             };
103             sub complete_float {
104             require Complete::Util;
105              
106             my %args = @_;
107             my $word = $args{word} // "";
108              
109             my @words;
110              
111             my $limit = 100;
112              
113             if (length($word) && $word !~ /\A-?\d*(\.\d*)?\z/) {
114             # warn: not a float
115             } else {
116             my @signs = ("");
117             push @signs, "-" if $word =~ /\A-|\A\z/;
118             for my $sign (@signs) {
119             for ("", 0..9,
120             ".0",".1",".2",".3",".4",".5",".6",".7",".8",".9") {
121             my $f = $sign . $word . $_;
122             next unless length $f;
123             next unless $f =~ /\A-?\d+(\.\d+)?\z/;
124             next if $f eq '-0';
125             next if $f =~ /\A-?0\d\z/;
126             next if defined($args{min} ) && $f < $args{min};
127             next if defined($args{xmin}) && $f <= $args{xmin};
128             next if defined($args{max} ) && $f > $args{max};
129             next if defined($args{xmin}) && $f >= $args{xmax};
130             push @words, $f;
131             }
132             }
133             }
134              
135             Complete::Util::complete_array_elem(array=>\@words, word=>$word);
136             }
137              
138              
139             1;
140             # ABSTRACT: Complete numbers
141              
142             __END__