Skip to content

Instantly share code, notes, and snippets.

@ab5tract
Created December 19, 2025 11:39
Show Gist options
  • Select an option

  • Save ab5tract/954fe3b45e8b6da39b5442c6892197c9 to your computer and use it in GitHub Desktop.

Select an option

Save ab5tract/954fe3b45e8b6da39b5442c6892197c9 to your computer and use it in GitHub Desktop.
#!/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