Skip to content

Commit

Permalink
First-draft implementation of Rat datatype.
Browse files Browse the repository at this point in the history
  • Loading branch information
pmichaud committed Aug 30, 2009
1 parent 80fdc48 commit 9fff158
Showing 1 changed file with 47 additions and 0 deletions.
47 changes: 47 additions & 0 deletions src/setting/Rat.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
class Rat {
has $.numerator;
has $.denominator;

multi method new(Int $numerator is copy, Int $denominator is copy) {
if $denominator < 0 {
$numerator = -$numerator;
$denominator = -$denominator;
}
self.bless(*, :$numerator, :$denominator);
}

multi method Str() { "$!numerator/$!denominator"; }

multi method Num() { $!numerator + 0.0 / $!denominator }
}

multi sub infix:<+>(Rat $a, Rat $b) {
Rat.new($a.numerator * $b.denominator + $b.numerator * $a.denominator,
$a.denominator * $b.denominator );
}

multi sub infix:<+>(Rat $a, Int $b) {
Rat.new($a.numerator + $b * $a.denominator, $a.denominator);
}

multi sub infix:<+>(Int $a, Rat $b) {
Rat.new($a * $b.denominator + $b.numerator, $b.denominator);
}

multi sub infix:<->(Rat $a, Rat $b) {
Rat.new($a.numerator * $b.denominator + $b.numerator * $a.denominator,
$a.denominator * $b.denominator );
}

multi sub infix:<->(Rat $a, Int $b) {
Rat.new($a.numerator - $b * $a.denominator, $a.denominator);
}

multi sub infix:<*>(Rat $a, Rat $b) {
Rat.new($a.numerator * $b.numerator, $a.denominator * $b.denominator);
}

multi sub infix:</>(Rat $a, Rat $b) {
Rat.new($a.numerator * $b.denominator, $a.denominator * $b.numerator);
}

0 comments on commit 9fff158

Please sign in to comment.