Index Int.
,
. , .
. , ,
, , .
class ListNode
node, , ,
integer ordinal, struct ListIndex
Comparable.
struct ListIndex node nil
endIndex.
struct LinkedListCollection<T>: Collection {
class ListNode {
let element: T
let next: ListNode?
let ordinal: Int
init(element: T, next: ListNode?, ordinal: Int) {
self.element = element
self.next = next
self.ordinal = ordinal
}
convenience init?<I: IteratorProtocol>(it: inout I, ordinal: Int = 0) where I.Element == T {
if let el = it.next() {
self.init(element: el, next: ListNode(it: &it, ordinal: ordinal + 1), ordinal: ordinal)
} else {
return nil
}
}
}
struct ListIndex: Comparable {
let node: ListNode?
static func <(lhs: ListIndex, rhs: ListIndex) -> Bool {
switch (lhs.node?.ordinal, rhs.node?.ordinal) {
case let (r?, l?):
return r < l
case (_?, nil):
return true
default:
return false
}
}
static func ==(lhs: ListIndex, rhs: ListIndex) -> Bool {
return lhs.node?.ordinal == rhs.node?.ordinal
}
}
let startIndex: ListIndex
let endIndex: ListIndex
init<S: Sequence>(elements: S) where S.Iterator.Element == T {
var it = elements.makeIterator()
startIndex = ListIndex(node: ListNode(it: &it))
endIndex = ListIndex(node: nil)
}
func index(after i: ListIndex) -> ListIndex {
guard let next = i.node?.next else {
return endIndex
}
return ListIndex(node: next)
}
subscript (position: ListIndex) -> T {
guard let node = position.node else {
fatalError("index out of bounds")
}
return node.element
}
}
:
let coll = LinkedListCollection(elements: [1, 1, 2, 3, 5, 8, 13])
for idx in coll.indices {
print(coll[idx])
}