Spaces:
Sleeping
Sleeping
File size: 1,898 Bytes
6ee917b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | import Foundation
/// A generic reader that caches all file system reads
final class GenericReaderCached<Domain: GenericDomain, Variable: GenericVariable>: GenericReaderProtocol where Variable: Hashable {
private var cache: [VariableAndTime: DataAndUnit]
let reader: GenericReader<Domain, Variable>
/// Used as key for cache
struct VariableAndTime: Hashable {
let variable: Variable
let time: TimerangeDtAndSettings
}
/// Elevation of the grid point
var modelElevation: ElevationOrSea {
return reader.modelElevation
}
/// The desired elevation. Used to correct temperature forecasts
var targetElevation: Float {
return reader.targetElevation
}
/// Latitude of the grid point
var modelLat: Float {
return reader.modelLat
}
/// Longitude of the grid point
var modelLon: Float {
return reader.modelLon
}
/// Longitude of the grid point
var domain: Domain {
return reader.domain
}
var modelDtSeconds: Int {
return reader.modelDtSeconds
}
public init(reader: GenericReader<Domain, Variable>) {
self.reader = reader
self.cache = .init()
}
func get(variable: Variable, time: TimerangeDtAndSettings) throws -> DataAndUnit {
if let value = cache[VariableAndTime(variable: variable, time: time)] {
return value
}
let data = try reader.get(variable: variable, time: time)
cache[VariableAndTime(variable: variable, time: time)] = data
return data
}
func getStatic(type: ReaderStaticVariable) throws -> Float? {
return try reader.getStatic(type: type)
}
func prefetchData(variable: Variable, time: TimerangeDtAndSettings) throws {
try reader.prefetchData(variable: variable, time: time)
}
}
|