// RUN: %target-swift-frontend -typecheck %s -dump-api-path %t.dump // RUN: diff -u %S/Inputs/dumped_api.swift %t.dump/dump_api.swift public class _AnyIteratorBase {} /// An abstract `IteratorProtocol` base class over `T` elements. /// /// Use this as a `Sequence`'s associated `Iterator` type when you /// don't want to expose details of the concrete iterator, a subclass. /// /// It is an error to create instances of `AnyIterator` that are not /// also instances of an `AnyIterator` subclass. /// /// See also: /// /// struct AnySequence /// func anyIterator(base: I) -> AnyIterator /// func anyIterator(nextImplementation: () -> T?) -> AnyIterator public class AnyIterator : _AnyIteratorBase, IteratorProtocol { /// Initialize the instance. May only be called from a subclass /// initializer. override public init() { super.init() } /// Advance to the next element and return it, or `nil` if no next /// element exists. /// /// Note: subclasses must override this method. public func next() -> T? {fatalError("abstract")} } /// Every `IteratorProtocol` can also be a `Sequence`. Note that /// traversing the sequence consumes the iterator. extension AnyIterator : Sequence { /// Returns `self`. public func makeIterator() -> AnyIterator { return self } } /// Return a `IteratorProtocol` instance that wraps `base` but whose type /// depends only on the type of `I.Element`. /// /// Example: /// /// func countStrings() -> AnyIterator { /// let lazyStrings = lazy(0..<10).map { String($0) } /// /// // This is a really complicated type of no interest to our /// // clients. /// let g: MapSequenceIterator, String> /// = lazyStrings.makeIterator() /// return anyIterator(g) /// } public func anyIterator(base: I) -> AnyIterator { return FooIteratorBox(base) } public class FooIteratorBox< Base: IteratorProtocol > : AnyIterator { init(_ base: Base) { self.base = base } public override func next() -> Base.Element? { return base.next() } var base: Base }