[swift-evolution] [Proposal] Random Unification
Ben Cohen
ben_cohen at apple.com
Fri Oct 6 13:47:52 CDT 2017
> On Oct 4, 2017, at 19:26, Xiaodi Wu via swift-evolution <swift-evolution at swift.org> wrote:
>
> extension Data {
> static func random(byteCount: Int) -> Data
> }
>
Instead of methods on specific concrete types, I’d prefer to have a Sequence or Collection-conforming type that you could compose with existing operations like init from a Sequence or replaceSubrange:
// Just a rough sketch...
struct RandomNumbers<T: FixedWidthInteger>: RandomAccessCollection {
let _range: ClosedRange<T>
let _count: Int
var startIndex: Int { return 0 }
var endIndex: Int { return _count }
subscript(i: Int) -> T { return _range.random() }
init(of: T.Type, count: Int) {
_range = T.min...T.max
_count = count
}
init(count: Int) {
self = RandomNumbers(of: T.self, count: count)
}
// possibly a constructor that takes a specific range
init<R: RangeExpression>(in: R, count: Int) where R.Bound == T {
// etc
}
}
for x in RandomNumbers(of: UInt8.self, count: 10) {
print(x)
}
let d = Data(RandomNumbers(count: 10))
var a = Array(0..<10)
a.replaceSubrange(5..., with: RandomNumbers(count: 5))
The tricky thing is that making it a Collection violates the (admittedly unwritten) rule that a collection should be multi-pass, in the sense that multiple passes produce different numbers. Then again, so can lazy collections with impure closures. At least it isn’t variable length (unlike a lazy filter). And making it a collection of defined size means it can be used efficiently with things like append and replaceSubrange which reserve space in advance
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20171006/72472fb0/attachment.html>
More information about the swift-evolution
mailing list