summaryrefslogtreecommitdiff
path: root/bayes
blob: 37352ce9221bcc6e18a2a4282449655c188e2596 (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
50
51
52
53
54
55
#!/usr/bin/env perl6 
use v6.d.PREVIEW;
 
grammar Message {
    regex TOP {
        <headers>
        <separator>
        <body>
    }
 
    token newline { [\x0d\x0a] | [\x0a\x0d] | \x0a | \x0d }
    token separator {
        [\x0a\x0d\x0a\x0d] | [\x0d\x0a\x0d\x0a] | \x0a ** 2 | \x0d ** 2
    }
    token body { .* }
    regex headers {
        <header>+ % <newline>
    }
    regex header {
        <name> \: \h* <value>
                 || <junk>
    }
    token name {
        <-[:\s]>+
    }
    regex value {
        <line>+ % [<newline> \h+]
    }
    token line { \N* }
    token junk { \N+ }
}
 
class Message-actions {
    method TOP($/{
        make %headers => $/<headers>.madebody => $/<body>.Str );
    }
    method headers($/{
        make %|$/<header>ยป.made );
    }
    method header($/{
        make $/<junk> ?? () !! ( $/<name>.Str => $/<value>.made );
    }
    method value($/{
        make $/<line>.join(' ')
    }
}
 
sub MAIN(*@files{
    say "Starting";my $start = now;
    my @messages = @files.race(:degree(10:batch(100)).map({
        my $email = $_.IO.slurp(:enc<utf8-c8>);
        my $match = Message.parse($email,:actions(Message-actions.new));
    });
    say "Took { now - $start } for { +@messages } messages";
}