P21 - Insert an element at a given position into an array.

Author: Scott Penrose

Specification

P21 (*) Insert an element at a given position into an array.
        You may choose to mutate the array in-place or to create a new
        sequence and return it.

Examples

Example 1 (mutating in-place);

> my @l = <a b c d>
> insert_at('alfa',@l,2);
> say ~@l;
a alfa b c d

Example 2 (creating a copy):

> say ~insert_at_copy('alfa', <a b c d>, 2);
a alfa b c d

Source code: P21-scottp.pl

use v6;

# a. Simple version, in place
#       @array  - your "@array" must always use "@" - even for a single element
#       .splice - Your array is also an object, you can call the method .splice
#               - offset - where to add (starting 0)
#               - length - how many to replace (0 for insert)
#               - What to add
my @array = <a b c d>;
@array.splice(1, 0, 'alfa');
say ~@array;

# b. Using a sub in-place
#       $in, @arr, $pos - you can insert an array in the middle of your parameters
#       The array is like a reference, so if you splice on the actual array, not a
#       copy of it, you will mutate the caller's copy.
#   However if you modify the argument, you must declare it with "is rw" or
#   the compiler may complain at you.
sub insert_at ($in, @arr, $pos) {
    @arr.splice($pos - 1, 0, $in);
    return;
}

my @array2 = <a b c d>;

insert_at('alfa', @array2, 2);
say ~@array2;

# c. Using a sub, returning a copy
#    This time we must copy the sequence and mutate that
sub insert_at_copy($in, @list is copy, $pos) {
    @list.splice($pos-1, 0, $in);
    return @list;
}

say ~insert_at_copy('alfa', <a b c d>, 2);