File Coverage

blib/lib/Dallycot/Value/Numeric.pm
Criterion Covered Total %
statement 15 76 19.7
branch 0 10 0.0
condition 0 3 0.0
subroutine 5 21 23.8
pod 0 16 0.0
total 20 126 15.8


line stmt bran cond sub pod time code
1             package Dallycot::Value::Numeric;
2             our $AUTHORITY = 'cpan:JSMITH';
3              
4             # ABSTRACT: An arbitrary precision numeric value
5              
6 23     23   13653 use strict;
  23         43  
  23         858  
7 23     23   94 use warnings;
  23         32  
  23         546  
8              
9 23     23   95 use utf8;
  23         35  
  23         214  
10 23     23   853 use parent 'Dallycot::Value::Any';
  23         34  
  23         104  
11              
12 23     23   1261 use Promises qw(deferred);
  23         34  
  23         117  
13              
14             sub new {
15 0     0 0   my ( $class, $value ) = @_;
16              
17 0   0       $class = ref $class || $class;
18              
19 0 0         return bless [ ref($value) ? $value : Math::BigRat->new($value) ] => $class;
20             }
21              
22             sub to_rdf {
23 0     0 0   my($self, $model) = @_;
24              
25 0 0         if($self->[0]->is_int) {
    0          
    0          
    0          
26 0           return $model -> integer($self -> [0] -> bstr);
27             }
28             elsif($self -> [0] -> is_nan) {
29 0           my $bnode = $model->bnode;
30 0           $model -> add_type($bnode, 'loc:NotANumber');
31 0           return $bnode;
32             }
33             elsif($self -> [0] -> is_inf) {
34 0           my $bnode = $model -> bnode;
35 0           $model -> add_type($bnode, 'loc:PositiveInfinity');
36 0           return $bnode;
37             }
38             elsif($self -> [0] -> is_inf('-')) {
39 0           my $bnode = $model -> bnode;
40 0           $model -> add_type($bnode, 'loc:NegativeInifinity');
41 0           return $bnode;
42             }
43             else {
44 0           my $bnode = $model -> bnode;
45 0           $model -> add_type($bnode, 'loc:Rational');
46 0           my($n, $d) = $self -> [0] -> parts;
47 0           $model -> add_connection($bnode, 'loc:denominator',
48             $model -> integer($d -> bstr)
49             );
50 0           $model -> add_connection($bnode, 'loc:numerator',
51             $model -> integer($n->bstr)
52             );
53 0           return $bnode;
54             }
55             }
56              
57             sub id {
58 0     0 0   my ($self) = @_;
59 0           return $self->[0]->bstr . "^^Numeric";
60             }
61              
62 0     0 0   sub is_defined { return 1 }
63              
64 0     0 0   sub is_empty {return}
65              
66             sub as_text {
67 0     0 0   my ($self) = @_;
68              
69 0           return $self->[0]->bstr;
70             }
71              
72             sub value {
73 0     0 0   my ($self) = @_;
74 0           return $self->[0];
75             }
76              
77             sub calculate_length {
78 0     0 0   my ( $self, $engine ) = @_;
79              
80 0           return $self->new( $self->[0]->copy->bfloor->length );
81             }
82              
83             sub is_equal {
84 0     0 0   my ( $self, $engine, $other ) = @_;
85              
86 0           my $d = deferred;
87              
88 0           $d->resolve( $self->value == $other->value );
89              
90 0           return $d->promise;
91             }
92              
93             sub is_less {
94 0     0 0   my ( $self, $engine, $other ) = @_;
95              
96 0           my $d = deferred;
97              
98 0           $d->resolve( $self->value < $other->value );
99              
100 0           return $d->promise;
101             }
102              
103             sub is_less_or_equal {
104 0     0 0   my ( $self, $engine, $other ) = @_;
105              
106 0           my $d = deferred;
107              
108 0           $d->resolve( $self->value <= $other->value );
109              
110 0           return $d->promise;
111             }
112              
113             sub is_greater {
114 0     0 0   my ( $self, $engine, $other ) = @_;
115              
116 0           my $d = deferred;
117              
118 0           $d->resolve( $self->value > $other->value );
119              
120 0           return $d->promise;
121             }
122              
123             sub is_greater_or_equal {
124 0     0 0   my ( $self, $engine, $other ) = @_;
125              
126 0           my $d = deferred;
127              
128 0           $d->resolve( $self->value >= $other->value );
129              
130 0           return $d->promise;
131             }
132              
133             sub negated {
134 0     0 0   my($self) = @_;
135              
136 0           return $self->new( - $self->[0] );
137             }
138              
139             sub successor {
140 0     0 0   my ($self) = @_;
141              
142 0           my $d = deferred;
143              
144 0           $d->resolve( $self->new( $self->[0]->copy->binc ) );
145              
146 0           return $d->promise;
147             }
148              
149             sub predecessor {
150 0     0 0   my ($self) = @_;
151              
152 0           my $d = deferred;
153              
154 0           $d->resolve( $self->new( $self->[0]->copy->bdec ) );
155              
156 0           return $d->promise;
157             }
158              
159             1;