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: (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: (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)
|
|
}
|
|
}
|