Created
December 19, 2025 11:39
-
-
Save ab5tract/954fe3b45e8b6da39b5442c6892197c9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env raku | |
| use v6.*; | |
| enum LogLevel <error warning info debug>; | |
| class LogEvent { | |
| has LogLevel $.level is required; | |
| has Str $.message handles <gist Str>; | |
| } | |
| sub generate-logs(LogLevel $level) { | |
| state BagHash $bag .= new; | |
| my $current = ++$bag{$level}; | |
| LogEvent.new: :$level, :message("$level no. $current"); | |
| } | |
| # Bigger edition | |
| #my @logs = |(generate-logs(LogLevel::error) xx 666), | |
| # |(generate-logs(LogLevel::warning) xx 222), | |
| # |(generate-logs(LogLevel::debug) xx 333), | |
| # |(generate-logs(LogLevel::info) xx 1111); | |
| my @logs = |(generate-logs(LogLevel::error) xx 6), | |
| |(generate-logs(LogLevel::warning) xx 2), | |
| |(generate-logs(LogLevel::debug) xx 3), | |
| |(generate-logs(LogLevel::info) xx 11); | |
| # Use .= roll(*) for an infinite list! | |
| @logs .= pick(*); | |
| role LogHandler { | |
| has %.logs; | |
| has LogLevel $.valid-level = LogLevel::warning; | |
| method handle-log-event(LogEvent $event) { ... } | |
| method append(@logs) { | |
| sink @logs.map: -> $log { | |
| self.handle-log-event($log) if $log.level <= $!valid-level; | |
| %!logs{$log.level}.push: $log; | |
| $log | |
| } | |
| # %!logs = %!logs.pairs.map: { .key => .value.sort }; | |
| # dd :log-counts(%!logs.pairs.map: { .key => .value.Int }); | |
| } | |
| } | |
| class LogHandler::Printer does LogHandler { | |
| method handle-log-event(LogEvent $event) { | |
| say $event.message; | |
| } | |
| } | |
| role LogProcessor { | |
| method process-log-event(LogEvent $event) { ... } | |
| method append(@logs) { | |
| @logs.map: -> $log { | |
| self.process-log-event($log) | |
| } | |
| } | |
| } | |
| role LogProcessor::Yeet does LogProcessor { | |
| method process-log-event(LogEvent $event) { | |
| LogEvent.new: :level($event.level), :message("(╯°□°)╯︵ ┻━┻ " ~ $event.message) | |
| } | |
| } | |
| my LogHandler::Printer $log-handler .= new; | |
| my LogProcessor::Yeet $yeet-processor .= new; | |
| # Works (also with @logs.roll(*)) | |
| $yeet-processor.append(@logs) ==> $log-handler; | |
| # Does not work (yeet processing not applied) | |
| @logs ==> $yeet-processor ==> $log-handler; | |
| =begin pod | |
| =begin output | |
| (╯°□°)╯︵ ┻━┻ warning no. 2 | |
| (╯°□°)╯︵ ┻━┻ warning no. 1 | |
| (╯°□°)╯︵ ┻━┻ error no. 3 | |
| (╯°□°)╯︵ ┻━┻ error no. 2 | |
| (╯°□°)╯︵ ┻━┻ error no. 1 | |
| (╯°□°)╯︵ ┻━┻ error no. 4 | |
| (╯°□°)╯︵ ┻━┻ error no. 5 | |
| (╯°□°)╯︵ ┻━┻ error no. 6 | |
| warning no. 2 | |
| warning no. 1 | |
| error no. 3 | |
| error no. 2 | |
| error no. 1 | |
| error no. 4 | |
| error no. 5 | |
| error no. 6 | |
| =end output | |
| =end pod |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment