aboutsummaryrefslogtreecommitdiff
path: root/challenge-058/simon-proctor/raku/ch-1.p6
blob: 26c150ecf79b00582de7fbfb8e29d7239b8ad1dd (plain)
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
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env raku

use v6;

my $matcher = / ^ $<ver> = (\d+)+ % "." ( "_" $<patch> = (\d+) ) ? $ /;

subset ValidVer of Str where * ~~ $matcher;

class PWCVersion {
    
    has @.points;
    has Int $.patch; 
    multi method new ( ::?CLASS:U: ValidVer $str ) {
        my $match = $str ~~ $matcher;
        
        if defined $match[0]<patch> {
            self.bless(
                :points( $match<ver>.values.map(*.Int)  ),
                :patch( $match[0]<patch>.Int )
            );
        } else {
            self.bless(
                :points( $match<ver>.values.map(*.Int)  ),
            );
        }
    }

    method Str () {
        "{@!points.join('.')}{(defined $!patch)?? '_' ~ $!patch !! '' }"
    }

    method gist() { self.Str }
}

multi sub infix:<cmp> ( PWCVersion $v1, PWCVersion $v2 ) {
    return $v1.points cmp $v2.points unless ($v1.points cmp $v2.points) ~~ Same;

    return Same if ! $v1.patch && ! $v2.patch;
    return More if $v1.patch && ! $v2.patch;
    return Less if ! $v1.patch && $v2.patch;

    return $v1.patch <=> $v2.patch;
}

sub MAIN( ValidVer $str1, ValidVer $str2 ) {
    my $v1 = PWCVersion.new($str1);
    my $v2 = PWCVersion.new($str2);
    say "$v1 <=> $v2 : {+($v1 cmp $v2)}";
}