Skip to content

Instantly share code, notes, and snippets.

@JadenGeller
Created March 24, 2015 09:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JadenGeller/7fdaaa11c82636ec0bda to your computer and use it in GitHub Desktop.
Save JadenGeller/7fdaaa11c82636ec0bda to your computer and use it in GitHub Desktop.
Swift Bulk Generator
struct BulkGenerator<G : GeneratorType> : GeneratorType {
var generator: G
var bulk: [G.Element]
var size: Int
init(generator: G, size: Int){
assert(size > 0, "Bulk size must be a positive integer")
self.generator = generator
self.size = size
self.bulk = Array<G.Element>()
}
mutating func next() -> [G.Element]? {
while bulk.count < size {
if let next = generator.next() { bulk.append(next) }
else { return nil }
}
let grab = bulk
bulk.removeAtIndex(0)
return grab
}
}
struct BulkSequence<S : SequenceType> : SequenceType {
let sequence: S
let size: Int
init(sequence: S, size: Int){
self.sequence = sequence
self.size = size
}
func generate() -> BulkGenerator<S.Generator> {
return BulkGenerator(generator: sequence.generate(), size: size)
}
}
func bulk<S : SequenceType>(size: Int) -> S -> BulkSequence<S> {
return { sequence in
return BulkSequence(sequence: sequence, size: size)
}
}
// Example
var str = "Hey World"
for c in bulk(4)(str) {
println(c) // -> [H, e, y, ]
} // [e, y, , W]
// [y, , W, o]
// [ , W, o, r]
// [W, o, r, l]
// [o, r, l, d]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment