mirror of
https://github.com/apple/swift-foundation.git
synced 2025-05-28 09:47:07 +08:00
* Add Duration formatting and utility files to FoundationInternationalization. This commit moves existing files as-is to FoundationInternationalization. We'll address compatibility fixes in the following commits. * Add partial implementation for Measurement.FormatStyle `Duration.FormatStyle` uses `Measurement.FormatStyle.UnitWidth` internally. This PR adds a partial implementation for `Measurement.FormatStyle` to maintain source compatibility for `Duration.FormatStyle`. `Measurement.FormatStyle` is built on top of `struct Measurement<Dimension>`, which isn't available in the package yet. To unblock ourselves, add stubs for relevant types if they're not available for now. * Addressing compatibility issues post file move - Add functions to generate ICU skeleton to `ICUMeasurementNumberFormatter`: The function was originally declared as a `static func` in `Measurement.FormatStyle`. Re-work this into `ICUMeasurementNumberFormatter` since this function is only relevant when used with this class. - Use Glibc for `pow` when Darwin isn't available * Move test files * Move test files * Compatibility fix: typealias Duration.TimeFormatStyle and Duration.UnitsFormatStyle XCTest explicitly exports Foundation, so referring to `Duration.UnitsFormatStyle` and `Duration.TimeFormatStyle` raises amibiguity errors on Darwin since the compiler doesn't know if they refer to the ones defined in the package or the one in Foundation. We've been working around this issue by referring common types with prefix of package name (see TestSupport.swift). However we cannot do that for `Duration.UnitsFormatStyle` since this type is declared as `extension Duration`, and there's no way to disambiguate or typealias extensions on stdlib types. Workaround this by declaring `Duration._UnitsFormatStyle` as a typealias of `Duration.FormatStyle`, and use the former in the test. This way, when Darwin is imported, `_UnitsFormatStyle` would refer to the `Duration.UnitsFormatStyle` declared in Foundation, and the one in the package otherwise.
58 lines
2.0 KiB
Swift
58 lines
2.0 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2020 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#if !FOUNDATION_FRAMEWORK
|
|
|
|
// stub
|
|
public struct Measurement<UnitType> {}
|
|
public class Dimension {}
|
|
public class UnitDuration: Dimension {}
|
|
|
|
extension Measurement where UnitType: Dimension {
|
|
public struct FormatStyle : Sendable {
|
|
public struct UnitWidth : Codable, Hashable, Sendable {
|
|
/// Examples for formatting a measurement with value of 37.20:
|
|
///
|
|
/// Shows the unit in its full spelling.
|
|
/// For example, "37.20 Calories", "37,20 litres"
|
|
public static var wide: Self { .init(option: .wide) }
|
|
|
|
/// Shows the unit using abbreviation.
|
|
/// For example, "37.20 Cal", "37,2 L"
|
|
public static var abbreviated: Self { .init(option: .abbreviated) }
|
|
|
|
/// Shows the unit in the shortest form possible, and may condense the spacing between the value and the unit.
|
|
/// For example, "37.20Cal", "37,2L"
|
|
public static var narrow: Self { .init(option: .narrow) }
|
|
|
|
enum Option: Int, Codable, Hashable {
|
|
case wide
|
|
case abbreviated
|
|
case narrow
|
|
}
|
|
var option: Option
|
|
|
|
var skeleton: String {
|
|
switch option {
|
|
case .wide:
|
|
return "unit-width-full-name"
|
|
case .abbreviated:
|
|
return "unit-width-short"
|
|
case .narrow:
|
|
return "unit-width-narrow"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif // !FOUNDATION_FRAMEWORK
|