diff --git a/Sources/FirebladeECS/SparseSet.swift b/Sources/FirebladeECS/SparseSet.swift index 957f9fa..cbe9f9f 100644 --- a/Sources/FirebladeECS/SparseSet.swift +++ b/Sources/FirebladeECS/SparseSet.swift @@ -65,15 +65,31 @@ public class SparseSet: UniformStorage, Sequence { sparse.removeAll(keepingCapacity: keepingCapacity) } - public func makeIterator() -> AnyIterator { + public func makeIterator() -> SparseIterator { + return SparseIterator(self) + /* + // NOTE: was optimized by using a dedicated iterator implementation var iter = dense.makeIterator() - return AnyIterator { - guard let next: Pair? = iter.next() else { return nil } - guard let pair: Pair = next else { return nil } - return pair.value - } + return AnyIterator.init { + guard let next: Pair = iter.next() as? Pair else { return nil } + return next.value + }*/ } + public struct SparseIterator: IteratorProtocol { + private let sparseSet: SparseSet + private var iterator: IndexingIterator> + init(_ sparseSet: SparseSet) { + self.sparseSet = sparseSet + self.iterator = sparseSet.dense.makeIterator() + } + + mutating public func next() -> Element? { + guard let next: Pair = iterator.next() as? Pair else { return nil } + return next.value as? Element + } + + } } public class SparseComponentSet: SparseSet {