/// \brief The once and future sequence traversal protocol protocol Generator { typealias Element func next() -> Optional } /// \brief Adapt an old-style Enumerator into a Generator struct EnumeratorAsGenerator : Generator { typealias Element = T.Element constructor(x: T) { this.x.value = x } func next() -> Optional { if x.value.isEmpty() { return None } return Some(x.value.next()) } var x : GenericIVar } func asGenerator(x: T) -> EnumeratorAsGenerator { typealias Ret = EnumeratorAsGenerator return Ret(x) } /// \brief Adapt a Generator into an old-style Enumerator struct GeneratorAsEnumerator : Enumerable, Enumerator { constructor(x: T) { this.x.value = x } // Satisfy Enumerable protocol typealias EnumeratorType = GeneratorAsEnumerator func getEnumeratorType() -> EnumeratorType { return this } // Satisfy Enumerator protocol typealias Element = T.Element func isEmpty() -> Bool { if buffer.value.isNone() { buffer.value = Some(x.value.next()) } return buffer.value.get() == None } func next() -> Element { if buffer.value == None { buffer.value = Some(x.value.next()) } var ret = buffer.value.get().get() buffer.value = None return ret } var buffer: GenericIVar>> var x : GenericIVar } func asEnumerator(x: T) -> GeneratorAsEnumerator { typealias Ret = GeneratorAsEnumerator return Ret(x) }