mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			128 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			128 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Swift
		
	
| // Copyright © 2024 Rangeproof Pty Ltd. All rights reserved.
 | |
| //
 | |
| // stringlint:disable
 | |
| 
 | |
| import Foundation
 | |
| 
 | |
| public enum TimeUnit: Equatable, CustomStringConvertible {
 | |
|     case nanoseconds(Double)
 | |
|     case microseconds(Double)
 | |
|     case milliseconds(Double)
 | |
|     case seconds(Double)
 | |
|     case minutes(Double)
 | |
|     case hours(Double)
 | |
|     case days(Double)
 | |
|     case weeks(Double)
 | |
|     
 | |
|     var timeInterval: TimeInterval {
 | |
|         switch self {
 | |
|             case .nanoseconds(let value): return (value * 1e-9)
 | |
|             case .microseconds(let value): return (value * 1e-6)
 | |
|             case .milliseconds(let value): return (value * 1e-3)
 | |
|             case .seconds(let value): return value
 | |
|             case .minutes(let value): return (value * 60)
 | |
|             case .hours(let value): return (value * 3600)
 | |
|             case .days(let value): return (value * 86400)
 | |
|             case .weeks(let value): return (value * 604800)
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     var unit: Unit {
 | |
|         switch self {
 | |
|             case .nanoseconds: return .nanoseconds
 | |
|             case .microseconds: return .microseconds
 | |
|             case .milliseconds: return .milliseconds
 | |
|             case .seconds: return .seconds
 | |
|             case .minutes: return .minutes
 | |
|             case .hours: return .hours
 | |
|             case .days: return .days
 | |
|             case .weeks: return .weeks
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     public var description: String {
 | |
|         switch self {
 | |
|             case .nanoseconds(let value): return "\(value)\(unit)"
 | |
|             case .microseconds(let value): return "\(value)\(unit)"
 | |
|             case .milliseconds(let value): return "\(value)\(unit)"
 | |
|             case .seconds(let value): return "\(value)\(unit)"
 | |
|             case .minutes(let value): return "\(value)\(unit)"
 | |
|             case .hours(let value): return "\(value)\(unit)"
 | |
|             case .days(let value): return "\(value)\(unit)"
 | |
|             case .weeks(let value): return "\(value)\(unit)"
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     public init(_ other: TimeUnit, unit: Unit, resolution: Int? = nil) {
 | |
|         let otherSeconds: TimeInterval = other.timeInterval
 | |
|         let convertedValue: Double = {
 | |
|             switch unit {
 | |
|                 case .nanoseconds: return (otherSeconds / 1e-9)
 | |
|                 case .microseconds: return (otherSeconds / 1e-6)
 | |
|                 case .milliseconds: return (otherSeconds / 1e-3)
 | |
|                 case .seconds: return (otherSeconds)
 | |
|                 case .minutes: return (otherSeconds / 60)
 | |
|                 case .hours: return (otherSeconds / 3600)
 | |
|                 case .days: return (otherSeconds / 86400)
 | |
|                 case .weeks: return (otherSeconds / 604800)
 | |
|             }
 | |
|         }()
 | |
|         let result: Double = {
 | |
|             guard let resolution: Int = resolution else { return convertedValue }
 | |
|             guard resolution > 0 else { return floor(convertedValue) }
 | |
|             
 | |
|             let targetResolution: TimeInterval = pow(10, TimeInterval(resolution))
 | |
|             
 | |
|             return (floor(convertedValue * targetResolution) / targetResolution)
 | |
|         }()
 | |
|         
 | |
|         switch unit {
 | |
|             case .nanoseconds: self = .nanoseconds(result)
 | |
|             case .microseconds: self = .microseconds(result)
 | |
|             case .milliseconds: self = .milliseconds(result)
 | |
|             case .seconds: self = .seconds(result)
 | |
|             case .minutes: self = .minutes(result)
 | |
|             case .hours: self = .hours(result)
 | |
|             case .days: self = .days(result)
 | |
|             case .weeks: self = .weeks(result)
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| // MARK: - TimeUnit.Unit
 | |
| 
 | |
| public extension TimeUnit {
 | |
|     enum Unit: CustomStringConvertible {
 | |
|         case nanoseconds
 | |
|         case microseconds
 | |
|         case milliseconds
 | |
|         case seconds
 | |
|         case minutes
 | |
|         case hours
 | |
|         case days
 | |
|         case weeks
 | |
|         
 | |
|         public static var ns: Unit = .nanoseconds
 | |
|         public static var us: Unit = .microseconds   //µs
 | |
|         public static var ms: Unit = .milliseconds
 | |
|         public static var s: Unit = .seconds
 | |
|         public static var m: Unit = .minutes
 | |
|         public static var h: Unit = .hours
 | |
|         public static var d: Unit = .days
 | |
|         public static var w: Unit = .weeks
 | |
|         
 | |
|         public var description: String {
 | |
|             switch self {
 | |
|                 case .nanoseconds: return "ns"
 | |
|                 case .microseconds: return "µs"
 | |
|                 case .milliseconds: return "ms"
 | |
|                 case .seconds: return "s"
 | |
|                 case .minutes: return "m"
 | |
|                 case .hours: return "h"
 | |
|                 case .days: return "d"
 | |
|                 case .weeks: return "w"
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |