The shuffle function is not pure functional, it's stateful by definition and by design.
Two calls to shuffle(x) with the same parameter x may by design return different results, so it's not referentially transparent.
I'm not sure what I was thinking here. It's useful but flies in the face of the principles of this library.
It would be possible to take a PRNG state as an argument to regain referential transparency but I'm not sure I really want to do that here.