//===--- EmptyCollection.swift - A collection with no elements ------------===// // // 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 // //===----------------------------------------------------------------------===// // // Sometimes an operation is best expressed in terms of some other, // larger operation where one of the parameters is an empty // collection. For example, we can erase elements from an Array by // replacing a subrange with the empty collection. // //===----------------------------------------------------------------------===// struct EmptyGenerator : Generator, Sequence { func generate() -> EmptyGenerator { return self } mutating func next() -> T? { return nil } } struct EmptyCollection : Collection { typealias IndexType = Int var startIndex: IndexType { return 0 } var endIndex: IndexType { return 0 } func generate() -> EmptyGenerator { return EmptyGenerator() } subscript(i: IndexType) -> T { _preconditionFailure("Index out of range") } } // Specialization of countElements for EmptyCollection func ~> (x:EmptyCollection, _:(_CountElements, ())) -> Int { return 0 }