// // PreferenceKey.swift // TuskerPreferences // // Created by Shadowfacts on 4/12/24. // import Foundation public protocol PreferenceKey { associatedtype Value: Codable static var defaultValue: Value { get } static func didSet(in store: PreferenceStore, newValue: Value) } extension PreferenceKey { static func didSet(in store: PreferenceStore, newValue: Value) {} } protocol MigratablePreferenceKey: PreferenceKey where Value: Equatable { static func shouldMigrate(oldValue: Value) -> Bool } extension MigratablePreferenceKey { static func shouldMigrate(oldValue: Value) -> Bool { oldValue != defaultValue } } protocol CustomCodablePreferenceKey: PreferenceKey { static func encode(value: Value, to encoder: any Encoder) throws static func decode(from decoder: any Decoder) throws -> Value? }