Skip to content

Instantly share code, notes, and snippets.

@takasek
Last active April 3, 2016 10:58
Show Gist options
  • Save takasek/8afb5a6dacd9478b876e746bdd27099d to your computer and use it in GitHub Desktop.
Save takasek/8afb5a6dacd9478b876e746bdd27099d to your computer and use it in GitHub Desktop.
熊谷さんの https://t.co/VICPp6Pmbg を参考にしつつ、さっき書いた植木算ジェネレータをstruct化してみた。 #CodePiece #cswift
struct UekizanGenerator<S: SequenceType, E where S.Generator.Element == E> : GeneratorType {
typealias Element = E
private let margin: E
private var elementGenerator: S.Generator
private var preserved: E?
private var isMargin = false
init(_ sources: S, margin: E) {
self.margin = margin
elementGenerator = sources.generate()
preserved = elementGenerator.next()
}
mutating func next() -> E? {
defer { isMargin = !isMargin }
return isMargin ? getMargin() : getElement()
}
private func getMargin() -> E? {
guard preserved != nil else { return nil }
return margin
}
private mutating func getElement() -> E? {
defer { preserved = elementGenerator.next() }
return preserved
}
}
let gen = UekizanGenerator([10, 20, 30], margin: 7)
let sequence = AnySequence { gen }
for i in sequence {
print(i)
}
sequence.reduce(0, combine: +)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment