Last active
April 3, 2016 10:58
-
-
Save takasek/8afb5a6dacd9478b876e746bdd27099d to your computer and use it in GitHub Desktop.
熊谷さんの https://t.co/VICPp6Pmbg を参考にしつつ、さっき書いた植木算ジェネレータをstruct化してみた。 #CodePiece #cswift
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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