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