blob: e81c4668896ce1375707ca845f0cbe9b0753cd67 [file] [log] [blame]
//===--- Repeat.swift - A Collection that repeats a value N times ---------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 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
//
//===----------------------------------------------------------------------===//
/// A collection whose elements are all identical `Element`s.
public struct Repeated<Element> : RandomAccessCollection {
public typealias Indices = CountableRange<Int>
/// A type that represents a valid position in the collection.
///
/// Valid indices consist of the position of every element and a
/// "past the end" position that's not valid for use as a subscript.
public typealias Index = Int
/// Construct an instance that contains `count` elements having the
/// value `repeatedValue`.
internal init(_repeating repeatedValue: Element, count: Int) {
_precondition(count >= 0, "Repetition count should be non-negative")
self.count = count
self.repeatedValue = repeatedValue
}
/// Always zero, which is the index of the first element in a
/// non-empty instance.
public var startIndex: Index {
return 0
}
/// Always equal to `count`, which is one greater than the index of
/// the last element in a non-empty instance.
public var endIndex: Index {
return count
}
/// Access the element at `position`.
///
/// - Precondition: `position` is a valid position in `self` and
/// `position != endIndex`.
public subscript(position: Int) -> Element {
_precondition(position >= 0 && position < count, "Index out of range")
return repeatedValue
}
/// The number of elements in this collection.
public let count: Int
/// The value of every element in this collection.
public let repeatedValue: Element
}
/// Return a collection containing `n` repetitions of `elementInstance`.
public func repeatElement<T>(_ element: T, count n: Int) -> Repeated<T> {
return Repeated(_repeating: element, count: n)
}
@available(*, unavailable, renamed: "Repeated")
public struct Repeat<Element> {}
extension Repeated {
@available(*, unavailable, message: "Please use repeatElement(_:count:) function instead")
public init(count: Int, repeatedValue: Element) {
Builtin.unreachable()
}
}