// // WeakArray.swift // Tusker // // Created by Shadowfacts on 3/25/20. // Copyright © 2020 Shadowfacts. All rights reserved. // import Foundation fileprivate class WeakWrapper { weak var value: T? init(_ value: T?) { self.value = value } } struct WeakArray: MutableCollection, RangeReplaceableCollection { private var array: [WeakWrapper] var startIndex: Int { array.startIndex } var endIndex: Int { array.endIndex } init() { array = [] } init(_ elements: [Element]) { array = elements.map { WeakWrapper($0) } } init(_ elements: [Element?]) { array = elements.map { WeakWrapper($0) } } subscript(position: Int) -> Element? { get { array[position].value } set(newValue) { array[position] = WeakWrapper(newValue) } } func index(after i: Int) -> Int { return array.index(after: i) } mutating func replaceSubrange(_ subrange: Range, with newElements: C) where C : Collection, Self.Element == C.Element { array.replaceSubrange(subrange, with: newElements.map { WeakWrapper($0) }) } }