Advertisement
Guest User

Untitled

a guest
Apr 25th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.22 KB | None | 0 0
  1. struct WeakArray<Element: AnyObject> {
  2. fileprivate var backing: [Weakable<Element>]
  3.  
  4. init(_ array: [Element]) {
  5. backing = array.map { Weakable($0) }
  6. }
  7.  
  8. mutating func cleanup() {
  9. backing = backing.flatMap { $0.element != nil ? $0 : nil }
  10. }
  11. }
  12.  
  13. extension WeakArray: Collection {
  14. typealias Iterator = IndexingIterator<[Element]>
  15. typealias Index = Int
  16.  
  17. private var flattened: [Element] {
  18. return backing.flatMap { $0.element }
  19. }
  20.  
  21. func makeIterator() -> IndexingIterator<[Element]> {
  22. return IndexingIterator(_elements: flattened)
  23. }
  24.  
  25. var startIndex: Int {
  26. return flattened.startIndex
  27. }
  28.  
  29. var endIndex: Int {
  30. return flattened.endIndex
  31. }
  32.  
  33. subscript(position: Int) -> Element {
  34. return flattened[position]
  35. }
  36.  
  37. func index(after i: Int) -> Int {
  38. return flattened.index(after: i)
  39. }
  40. }
  41.  
  42. extension WeakArray: ExpressibleByArrayLiteral {
  43. init(arrayLiteral elements: Element...) {
  44. backing = elements.map { Weakable($0) }
  45. }
  46. }
  47.  
  48. struct Weakable<Element: AnyObject> {
  49. private(set) weak var element: Element?
  50.  
  51. init(_ element: Element) {
  52. self.element = element
  53. }
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement