// Copyright 2016 Yandex LLC. All rights reserved. import Foundation @frozen public enum ModelReusability { case orphan case hasReusableObject(Object) } public struct ReuseResult { public let modelsReusability: [(Model, ModelReusability)] public let orphanObjects: [Object] public init(modelsReusability: [(Model, ModelReusability)], orphanObjects: [Object]) { self.modelsReusability = modelsReusability self.orphanObjects = orphanObjects } } @inlinable public func calculateReusabilityFor( _ objects: [R], with models: [M], canBeReused: (R, M) -> Bool ) -> ReuseResult { var orphanObjects = objects let modelsReusability: [(M, ModelReusability)] = models.map { model in guard let (index, reusedObject) = zip(orphanObjects.indices, orphanObjects) .first(where: { canBeReused($0.1, model) }) else { return (model, .orphan) } orphanObjects.remove(at: index) return (model, .hasReusableObject(reusedObject)) } return ReuseResult( modelsReusability: modelsReusability, orphanObjects: orphanObjects ) }