Hi Matthew,

I like these implementations, though I have some comments and 
simplifications.

Matthew Smillie wrote:
>   def shuffle
>     res = []
>     indices = (0...size).to_a.shuffle!
>     indices.each_with_index { |x, i|
>       block_given? ? yield(self[x]) : res[i] = self[x]
>     }
>     block_given? ? self : res
>   end
> end

I'm not too keen on #shuffle having a dual function as both a shuffler 
and an iterator -- I'd be more comfortable using `ary.shuffle.each'. 
That would also allow a major simplification of the implementation:

   class Array
     def shuffle
       values_at(*(0..size-1).to_a.shuffle!)
     end
   end


Cheers,
Daniel