In Code§

See primary documentation in context for method assuming.

method assuming(Callable:D $self: |primers)

Returns a new Callable that has been primed with the arguments passed to assuming. In other words, the new function implements the same behavior as the original, but has the values passed to .assuming already bound to the corresponding parameters.

my sub slow($n){ my $i = 0; $i++ while $i < $n; $i }

# takes only one parameter and as such wont forward $n
sub bench(&c) { c, now - ENTER now }

say &slow.assuming(10000000).&bench; # OUTPUT: «(10000000 7.5508834)␤»

For a sub with arity greater than one, you can use Whatever * for all of the positional parameters that are not "assumed".

sub first-and-last ( $first, $last ) {
    say "Name is $first $last";
}

my &surname-smith = &first-and-last.assuming( *, 'Smith' );

surname-smith( 'Joe' ); # OUTPUT: «Name is Joe Smith␤»

You can handle any combination of assumed and not assumed positional parameters:

sub longer-names ( $first, $middle, $last, $suffix ) {
    say "Name is $first $middle $last $suffix";
}

my &surname-public = &longer-names.assuming( *, *, 'Public', * );

surname-public( 'Joe', 'Q.', 'Jr.'); # OUTPUT: «Name is Joe Q. Public Jr.␤»

Named parameters can be assumed as well:

sub foo { say "$^a $^b $:foo $:bar" }
&foo.assuming(13, foo => 42)(24, bar => 72); # OUTPUT: «13 24 42 72␤»

And you can use .assuming on all types of Callables, including Methods and Blocks:

# We use a Whatever star for the invocant:
my &comber = Str.^lookup('comb').assuming( *, /R \w+/ );
say comber 'Raku is awesome! Ruby is great! And Rust is OK too';
# OUTPUT: «(Raku Ruby Rust)␤»

my &learner = {
    "It took me $:months months to learn $^lang"
}.assuming: 'Raku';
say learner months => 2;  # OUTPUT: «It took me 2 months to learn Raku␤»