LNVisitedTimeWrapper.swift 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. //
  2. // LNVisitedTimeWrapper.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/8.
  6. //
  7. import Foundation
  8. import AutoCodable
  9. @propertyWrapper
  10. struct LNVisitedTimeWrapper<T: Codable>: Codable {
  11. private var obj: T
  12. private(set) var visited: TimeInterval = curTime
  13. var wrappedValue: T {
  14. mutating get {
  15. visited = curTime
  16. return obj
  17. }
  18. set {
  19. obj = newValue
  20. }
  21. }
  22. var projectedValue: LNVisitedTimeWrapper { self }
  23. init(wrappedValue: T) {
  24. self.obj = wrappedValue
  25. visited = curTime
  26. }
  27. private init(obj: T, visited: TimeInterval) {
  28. self.obj = obj
  29. self.visited = visited
  30. }
  31. private enum CodingKeys: String, CodingKey {
  32. case obj
  33. case visited
  34. }
  35. init(from decoder: any Decoder) throws {
  36. let container = try decoder.container(keyedBy: CodingKeys.self)
  37. let obj = try container.decode(T.self, forKey: .obj)
  38. let visited = try container.decode(TimeInterval.self, forKey: .visited)
  39. self.init(obj: obj, visited: visited)
  40. }
  41. func encode(to encoder: any Encoder) throws {
  42. var container = encoder.container(keyedBy: CodingKeys.self)
  43. try container.encode(obj, forKey: .obj)
  44. try container.encode(visited, forKey: .visited)
  45. }
  46. }