// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//

public class NSEnumerator : NSObject {
    
    public func nextObject() -> AnyObject? {
        NSRequiresConcreteImplementation()
    }

}

extension NSEnumerator : Sequence {

    public struct Iterator : IteratorProtocol {
        let enumerator : NSEnumerator
        public func next() -> AnyObject? {
            return enumerator.nextObject()
        }
    }

    public func makeIterator() -> Iterator {
        return Iterator(enumerator: self)
    }

}

extension NSEnumerator {

    public var allObjects: [AnyObject] {
        return Array(self)
    }

}

internal class NSGeneratorEnumerator<Base : IteratorProtocol where Base.Element : AnyObject> : NSEnumerator {
    var generator : Base
    init(_ generator: Base) {
        self.generator = generator
    }
    
    override func nextObject() -> AnyObject? {
        return generator.next()
    }
}
