// ๐ฆ MaxValue<T: FloatingPoint>
public struct MaxValue<T: FloatingPoint>: PreferenceKey {
// value type
public typealias Value = T?
// default value (nil == not set)
public static var defaultValue: Value { nil }
// โญ๏ธ choose max value
public static func reduce(value: inout Value, nextValue: () -> Value) {
// โญ๏ธ [T?] --(compactMap)--> [T] --(max)--> T?
value = [value, nextValue()].compactMap{ $0 }.max()
}
}
// ๐ฆ AllValues<T>
public struct AllValues<T>: PreferenceKey {
// โญ๏ธ ๆถ้็่ณๆๆพๅจ [T] ่ฃก้ข
public typealias Value = [T]
// โญ๏ธ ๅๅงๅผ๏ผ็ฉบ้ฃๅ
public static var defaultValue: Value { Value() }
// โญ๏ธ ๅ ๅ ฅๆฐ่ณๆ็ๆนๆณ๏ผ[v1, v2, ...] + [vn]
public static func reduce(value: inout Value, nextValue: () -> Value) {
value += nextValue() // nextValue() == [vn]
}
}
// ๐ฆ FirstNonNil<T>
public struct FirstNonNil<T>: PreferenceKey {
public typealias Value = T?
// default value
public static var defaultValue: Value { nil }
// combine values from different child views
public static func reduce(value: inout Value, nextValue: () -> Value) {
value = value ?? nextValue() // nil or first non-nil value
}
}