mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The global first() and last() algorithms return T?, nil when empty All .first() and .last() methods became T? vars that are nil when the Collection is empty Swift SVN r20326
83 lines
2.0 KiB
Swift
83 lines
2.0 KiB
Swift
//===--- LazyCollection.swift ---------------------------------*- swift -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
%for traversal in [ 'Forward', 'Bidirectional', 'RandomAccess' ]:
|
|
% whereClause = 'where S.Index : %sIndexType' % traversal
|
|
% Self = 'Lazy%sCollection' % traversal
|
|
|
|
/// Augments `S` with lazy versions of various collection algorithms.
|
|
public
|
|
struct ${Self}<S: CollectionType ${whereClause}> : CollectionType {
|
|
public
|
|
init(_ base: S) {
|
|
self._base = base
|
|
}
|
|
|
|
public
|
|
func generate() -> S.Generator {
|
|
return self._base.generate()
|
|
}
|
|
|
|
public
|
|
var startIndex: S.Index {
|
|
return _base.startIndex
|
|
}
|
|
|
|
public
|
|
var endIndex: S.Index {
|
|
return _base.endIndex
|
|
}
|
|
|
|
/// True if and only if the collection is empty
|
|
public
|
|
var isEmpty: Bool {
|
|
return startIndex == endIndex
|
|
}
|
|
|
|
/// The first element, or `nil` if `self` is empty
|
|
public var first: S.Generator.Element? {
|
|
return Swift.first(self)
|
|
}
|
|
|
|
% if traversal != 'Forward':
|
|
/// The last element, or `nil` if `self` is empty
|
|
public var last: S.Generator.Element? {
|
|
return Swift.last(self)
|
|
}
|
|
% end
|
|
|
|
public
|
|
subscript(i: S.Index) -> S.Generator.Element {
|
|
return _base[i]
|
|
}
|
|
|
|
/// an Array, created on-demand, containing the elements of this
|
|
/// lazy CollectionType.
|
|
public var array: [S.Generator.Element] {
|
|
return Array(_base)
|
|
}
|
|
|
|
var _base: S
|
|
}
|
|
|
|
/// Augment `s` with lazy methods such as `map`, `filter`, etc.
|
|
public
|
|
func lazy<S: CollectionType ${whereClause}>(s: S) -> ${Self}<S> {
|
|
return ${Self}(s)
|
|
}
|
|
|
|
%end
|
|
|
|
// ${'Local Variables'}:
|
|
// eval: (read-only-mode 1)
|
|
// End:
|