[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