mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Swift
		
	
// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved.
 | 
						|
 | 
						|
import Foundation
 | 
						|
import SessionUtilitiesKit
 | 
						|
 | 
						|
class MockCaches: CachesType {
 | 
						|
    private var cacheInstances: [Int: MutableCacheType] = [:]
 | 
						|
    
 | 
						|
    // MARK: - Immutable Access
 | 
						|
    
 | 
						|
    public subscript<M, I>(cache: CacheInfo.Config<M, I>) -> I {
 | 
						|
        get { MockCaches.getValueSettingIfNull(cache: cache, &cacheInstances) }
 | 
						|
    }
 | 
						|
    
 | 
						|
    public subscript<M, I>(cache: CacheInfo.Config<M, I>) -> M? {
 | 
						|
        get { return (cacheInstances[cache.key] as? M) }
 | 
						|
        set { cacheInstances[cache.key] = newValue.map { cache.mutableInstance($0) } }
 | 
						|
    }
 | 
						|
    
 | 
						|
    public func setting<M, I>(cache: CacheInfo.Config<M, I>, to value: M?) -> MockCaches {
 | 
						|
        self[cache] = value
 | 
						|
        return self
 | 
						|
    }
 | 
						|
    
 | 
						|
    // MARK: - Mutable Access
 | 
						|
    
 | 
						|
    @discardableResult public func mutate<M, I, R>(
 | 
						|
        cache: CacheInfo.Config<M, I>,
 | 
						|
        _ mutation: (inout M) -> R
 | 
						|
    ) -> R {
 | 
						|
        var value: M = ((cacheInstances[cache.key] as? M) ?? cache.createInstance())
 | 
						|
        return mutation(&value)
 | 
						|
    }
 | 
						|
    
 | 
						|
    @discardableResult public func mutate<M, I, R>(
 | 
						|
        cache: CacheInfo.Config<M, I>,
 | 
						|
        _ mutation: (inout M) throws -> R
 | 
						|
    ) throws -> R {
 | 
						|
        var value: M = ((cacheInstances[cache.key] as? M) ?? cache.createInstance())
 | 
						|
        return try mutation(&value)
 | 
						|
    }
 | 
						|
    
 | 
						|
    @discardableResult private static func getValueSettingIfNull<M, I>(
 | 
						|
        cache: CacheInfo.Config<M, I>,
 | 
						|
        _ store: inout [Int: MutableCacheType]
 | 
						|
    ) -> I {
 | 
						|
        guard let value: M = (store[cache.key] as? M) else {
 | 
						|
            let value: M = cache.createInstance()
 | 
						|
            let mutableInstance: MutableCacheType = cache.mutableInstance(value)
 | 
						|
            store[cache.key] = mutableInstance
 | 
						|
            return cache.immutableInstance(value)
 | 
						|
        }
 | 
						|
        
 | 
						|
        return cache.immutableInstance(value)
 | 
						|
    }
 | 
						|
}
 |