Files
voxelotl-engine/Sources/Voxelotl/Random/RandomCollectionExtensions.swift

21 lines
571 B
Swift
Raw Normal View History

2024-08-23 16:55:59 +10:00
public extension MutableCollection {
mutating func shuffle<T: RandomProvider>(using provider: inout T) {
let count = self.count
guard count > 1 else {
2024-08-23 16:55:59 +10:00
return
}
for (first, remaining) in zip(self.indices, stride(from: count, to: 1, by: -1)) {
2024-08-23 16:55:59 +10:00
let i = self.index(first, offsetBy: provider.next(in: remaining))
self.swapAt(first, i)
}
}
}
public extension Sequence {
func shuffled<T: RandomProvider>(using provider: inout T) -> [Self.Element] {
var copy = Array(self)
copy.shuffle(using: &provider)
return copy
}
}