/
Div.pm6
33 lines (28 loc) · 901 Bytes
/
Div.pm6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use v6.c;
use XML::XPath::InfixExprOperatorPerElement;
class XML::XPath::ExprOperator::Div does XML::XPath::InfixExprOperatorPerElement {
method check($a, $b) {
unless $a.defined and $b.defined {
return False;
}
my $val_a = $a ~~ XML::Node ?? self!node-to-value($a) !! $a;
my $val_b = $b ~~ XML::Node ?? self!node-to-value($b) !! $b;
my $value;
if $val_a == 0 and $val_b == 0 {
$value = NaN;
} elsif $val_b == 0 {
$value = $val_a * Inf;
} else {
$value = $val_a / $val_b;
}
return $value;
}
method !node-to-value(XML::Node $node) {
if $node ~~ XML::Element {
my $txt = $node.contents.join: '';
return $txt;
} else {
X::NYI.new(feature => 'can not handle non XML::Element nodes').throw;
}
}
}