I've written vector version. As you can make subvectors really
fast, and you can take element at index really fast, I just throw
out last element at each iteration.
(letfn [(vec-throw-out [v i]
(pop (assoc v i (get v (dec (count v))]
(defn lazy-shuffle [v]
(if (seq v)
(let [idx
(letfn [(vec-throw-out [v i]
(pop (assoc v i (get v (dec (count v))]
(defn lazy-shuffle [v]
(if (seq v)
(let [idx (rand-int (count v))]
(cons
(get v idx)
(lazy-seq
(lazy-shuffle
(vec-throw-out v idx
(let [s (range 100)
v (vec s)]
(ti