/
Duration.pm
39 lines (31 loc) · 931 Bytes
/
Duration.pm
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
34
35
36
37
38
39
my class Duration is Cool does Real {
has Rat $.x = 0;
# A linear count of seconds.
method new($x) { self.bless: x => $x.Rat }
method Bridge(Duration:D:) { $!x.Num }
method Rat(Duration:D:) { $!x }
method Num(Duration:D:) { $!x.Num }
multi method Str(Duration:D:) { ~$.x }
multi method perl(Duration:D:) { "Duration.new({$.x.perl})" }
}
multi sub prefix:<->(Duration:D $a) {
Duration.new: -$a.x;
}
multi sub infix:<+>(Duration:D $a, Real $b) {
Duration.new: $a.x + $b;
}
multi sub infix:<+>(Real $a, Duration:D $b) {
Duration.new: $a + $b.x;
}
multi sub infix:<+>(Duration:D $a, Duration:D $b) {
Duration.new: $a.x + $b.x;
}
multi sub infix:<->(Duration:D $a, Real $b) {
Duration.new: $a.x - $b;
}
multi sub infix:<->(Duration:D $a, Duration:D $b) {
Duration.new: $a.x - $b.x;
}
multi sub infix:<%>(Duration:D $a, Real $b) {
Duration.new: $a.x % $b
}