#!/usr/bin/env perl6
use v6.d;
use FindBin::libs;
use ProcStats;

my %user-data   = ();
my $user-count  = 0;
my $adds        = 0;
my $drops       = 0;
my $ops         = 0;
my $max-keys    = 0;

sub random-string
(
    Int() :$size    = ( 1 .. 10 ).pick
    --> Str
)
{
    constant alpha  = [ 'a' ... 'z', 'A' ... 'Z' ];

    alpha.roll( $size ).join;
}

sub user-add
{
    ++$adds;
    $max-keys   = max $max-keys, %user-data.elems;

    ++%user-data{ random-string };             
}
sub user-drop
{
    %user-data
    or return;

    ++$drops;
    %user-data{ %user-data.pick.key } :delete;            
}
sub user-op     
{
    %user-data
    or return;

    ++$ops;
    ++%user-data{ %user-data.keys.pick };
}

print-stats label => "$*PROGRAM";

for 1 .. 100
{
    (
        &user-add  => 0.10,
        &user-drop => 0.10,
        &user-op   => 0.80,
    ).Mix.roll( 1_000 )».()
    ;

    print-stats label => 'Keys: ' ~ %user-data.elems;
}

print-stats :final, label => 'Keys: ' ~ %user-data.elems;
 
say '';
say 'Total adds:  ' ~ $adds;
say 'Total drops: ' ~ $drops;
say 'Total ops:   ' ~ $ops;
say 'Max keys:    ' ~ $max-keys; 
say 'Final keys:  ' ~ %user-data.elems;
say '';

