# "delete" and maybe a problem with gather

```# I want to shake an array, so its elements are ordered randomly.
#
# I discovered, that the behaviour of "delete" is odd and
#
#        something i can't discribe.
#
```
# Something with "gather". I know it is not finished, but I like to use it and...
`# huh... can't understand that bug below.`
```
# function: remove
# XXX # needed cause "delete @a, \$n" only do "@a[\$n] = undef".
# but "delete %a, \$n" really deletes the pair.
multi remove (@rray is rw, \$n)
{
my \$ret = @rray[\$n];
@rray = @rray[0..(\$n-1)],@rray[(\$n+1)..(@rray.end)];
\$ret;
}

multi steal (@rray is rw)
{
remove @rray, pick(0..(@rray.end));
}

multi shake (@rray is copy)
{
gather { take steal @rray while @rray }
}

### example ###

my @a = 0,1,2,3,4;

remove @a, 2;
# returns 2
# @a = 0,1,3,4

steal @a;
# returns maybe 1
# @a = 0,3,4

shake @a;
# XXX # don't do what it should
# it should return maybe 3,0,4
# but on my pugs it says:
# (#<Array:0x*******>,)

my @b = shake @a;
# returns (#<Scalar:0x*******>,)
# @b = (#<Array:0x*******>,)
# @b[0] = 0,3,4 ### always ###

# but watch this:

my @b = @a;
my @c = gather { take steal @b while @b } # exactly the same like "shake"
# @b = ()
# @c = 3,0,4
# a nice shake!
```