From 383944f8d04152660ed9970564d6ae47b001cfad Mon Sep 17 00:00:00 2001 From: MikePackard Date: Sat, 16 Mar 2024 14:26:05 +0700 Subject: [PATCH] add some feature, add IdentifiedArray --- .../IDEFindNavigatorScopes.plist | 5 + .../UserInterfaceState.xcuserstate | Bin 0 -> 62282 bytes .../xcschemes/xcschememanagement.plist | 57 ++++++++ Package.resolved | 134 ++++++++++-------- Package.swift | 12 +- Sources/Builder/IdentifiedArrayBuilder.swift | 14 ++ .../Transform/Collection/Dictionary+.swift | 10 ++ .../Collection/IdentifiedArray+.swift | 17 +++ Sources/Transform/Fundamental/Bool+.swift | 10 ++ Sources/Transform/Fundamental/Double+.swift | 16 +++ Sources/Transform/Fundamental/Int+.swift | 9 ++ Sources/Transform/Fundamental/URL+.swift | 11 ++ Sources/Transform/Important/ArrayExt.swift | 34 ++++- Sources/Transform/Important/DataExt.swift | 33 ++++- .../Important/IdentifiedArrayExt.swift | 54 +++++++ .../Important/MutableCollectionExt.swift | 14 -- Sources/Transform/Important/SetExt.swift | 10 +- Sources/Transform/Important/StringExt.swift | 2 +- 18 files changed, 362 insertions(+), 80 deletions(-) create mode 100644 .swiftpm/xcode/package.xcworkspace/xcuserdata/admin.xcuserdatad/IDEFindNavigatorScopes.plist create mode 100644 .swiftpm/xcode/package.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 .swiftpm/xcode/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Sources/Builder/IdentifiedArrayBuilder.swift create mode 100644 Sources/Transform/Collection/IdentifiedArray+.swift create mode 100644 Sources/Transform/Fundamental/Bool+.swift create mode 100644 Sources/Transform/Important/IdentifiedArrayExt.swift delete mode 100644 Sources/Transform/Important/MutableCollectionExt.swift diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/admin.xcuserdatad/IDEFindNavigatorScopes.plist b/.swiftpm/xcode/package.xcworkspace/xcuserdata/admin.xcuserdatad/IDEFindNavigatorScopes.plist new file mode 100644 index 0000000..5dd5da8 --- /dev/null +++ b/.swiftpm/xcode/package.xcworkspace/xcuserdata/admin.xcuserdatad/IDEFindNavigatorScopes.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate b/.swiftpm/xcode/package.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..7c6985bff7e197a9290bf2c3f188c39402b573a9 GIT binary patch literal 62282 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 + + + + SchemeUserState + + Builder.xcscheme_^#shared#^_ + + orderHint + 1 + + DataStructures.xcscheme_^#shared#^_ + + orderHint + 2 + + Transform.xcscheme_^#shared#^_ + + orderHint + 3 + + swift-extension-Package.xcscheme_^#shared#^_ + + orderHint + 0 + + + SuppressBuildableAutocreation + + Builder + + primary + + + DataStructures + + primary + + + Transform + + primary + + + UnitTests + + primary + + + swift-extension + + primary + + + + + diff --git a/Package.resolved b/Package.resolved index 7ed0c62..0ae1d41 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,61 +1,77 @@ { - "object": { - "pins": [ - { - "package": "CwlCatchException", - "repositoryURL": "https://github.com/mattgallagher/CwlCatchException.git", - "state": { - "branch": null, - "revision": "35f9e770f54ce62dd8526470f14c6e137cef3eea", - "version": "2.1.1" - } - }, - { - "package": "CwlPreconditionTesting", - "repositoryURL": "https://github.com/mattgallagher/CwlPreconditionTesting.git", - "state": { - "branch": null, - "revision": "fb7a26374e8570ff5c68142e5c83406d6abae0d8", - "version": "2.0.2" - } - }, - { - "package": "Nimble", - "repositoryURL": "https://github.com/Quick/Nimble.git", - "state": { - "branch": null, - "revision": "c93f16c25af5770f0d3e6af27c9634640946b068", - "version": "9.2.1" - } - }, - { - "package": "Quick", - "repositoryURL": "https://github.com/Quick/Quick.git", - "state": { - "branch": null, - "revision": "bd86ca0141e3cfb333546de5a11ede63f0c4a0e6", - "version": "4.0.0" - } - }, - { - "package": "SwiftDocCPlugin", - "repositoryURL": "https://github.com/apple/swift-docc-plugin", - "state": { - "branch": null, - "revision": "9b1258905c21fc1b97bf03d1b4ca12c4ec4e5fda", - "version": "1.2.0" - } - }, - { - "package": "SymbolKit", - "repositoryURL": "https://github.com/apple/swift-docc-symbolkit", - "state": { - "branch": null, - "revision": "b45d1f2ed151d057b54504d653e0da5552844e34", - "version": "1.0.0" - } - } - ] - }, - "version": 1 + "pins" : [ + { + "identity" : "cwlcatchexception", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattgallagher/CwlCatchException.git", + "state" : { + "revision" : "3ef6999c73b6938cc0da422f2c912d0158abb0a0", + "version" : "2.2.0" + } + }, + { + "identity" : "cwlpreconditiontesting", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattgallagher/CwlPreconditionTesting.git", + "state" : { + "revision" : "2ef56b2caf25f55fa7eef8784c30d5a767550f54", + "version" : "2.2.1" + } + }, + { + "identity" : "nimble", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Quick/Nimble.git", + "state" : { + "revision" : "c93f16c25af5770f0d3e6af27c9634640946b068", + "version" : "9.2.1" + } + }, + { + "identity" : "quick", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Quick/Quick.git", + "state" : { + "revision" : "bd86ca0141e3cfb333546de5a11ede63f0c4a0e6", + "version" : "4.0.0" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections", + "state" : { + "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-docc-plugin", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-docc-plugin", + "state" : { + "revision" : "26ac5758409154cc448d7ab82389c520fa8a8247", + "version" : "1.3.0" + } + }, + { + "identity" : "swift-docc-symbolkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-docc-symbolkit", + "state" : { + "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34", + "version" : "1.0.0" + } + }, + { + "identity" : "swift-identified-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-identified-collections", + "state" : { + "revision" : "d1e45f3e1eee2c9193f5369fa9d70a6ddad635e8", + "version" : "1.0.0" + } + } + ], + "version" : 2 } diff --git a/Package.swift b/Package.swift index 894d322..ab06910 100644 --- a/Package.swift +++ b/Package.swift @@ -22,19 +22,27 @@ let package = Package( .package(url: "https://github.com/Quick/Quick.git", from: "4.0.0"), .package(url: "https://github.com/Quick/Nimble.git", from: "9.2.0"), .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.1.0"), + .package(url: "https://github.com/apple/swift-collections", from: "1.0.2"), + .package(url: "https://github.com/pointfreeco/swift-identified-collections", from: "1.0.0"), ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. // Targets can depend on other targets in this package, and on products in packages this package depends on. .target( name: "Transform", - dependencies: []), + dependencies: [ + .product(name: "IdentifiedCollections", package: "swift-identified-collections"), + .product(name: "OrderedCollections", package: "swift-collections"), + ]), .target( name: "DataStructures", dependencies: []), .target( name: "Builder", - dependencies: []), + dependencies: [ + .product(name: "IdentifiedCollections", package: "swift-identified-collections"), + .product(name: "OrderedCollections", package: "swift-collections"), + ]), .testTarget( name: "UnitTests", dependencies: ["DataStructures", "Transform", "Quick", "Nimble"]), diff --git a/Sources/Builder/IdentifiedArrayBuilder.swift b/Sources/Builder/IdentifiedArrayBuilder.swift new file mode 100644 index 0000000..8e6f6af --- /dev/null +++ b/Sources/Builder/IdentifiedArrayBuilder.swift @@ -0,0 +1,14 @@ +import IdentifiedCollections +import Foundation + +@available(iOS 13, macOS 12, tvOS 13, watchOS 6, *) +public extension IdentifiedArray where Element: Identifiable { + init(@ArrayBuilder builder: () -> [Element]) where ID == Element.ID { + var identifiedArray: IdentifiedArrayOf = [] + let items = builder() + for item in items { + identifiedArray.updateOrAppend(item) + } + self = identifiedArray + } +} diff --git a/Sources/Transform/Collection/Dictionary+.swift b/Sources/Transform/Collection/Dictionary+.swift index 13f14cf..1802acb 100644 --- a/Sources/Transform/Collection/Dictionary+.swift +++ b/Sources/Transform/Collection/Dictionary+.swift @@ -22,4 +22,14 @@ public extension Dictionary where Value: Hashable { func has(key: Self.Key) -> Bool { self[key] != nil } + + func pick(keys: [Key]) -> [Key: Value] { + keys.reduce(into: [Key: Value]()) { partialResult, item in + partialResult[item] = self[item] + } + } + + func keys(for value: Value) -> [Key] { + return keys.filter({ self[$0] == value}) + } } diff --git a/Sources/Transform/Collection/IdentifiedArray+.swift b/Sources/Transform/Collection/IdentifiedArray+.swift new file mode 100644 index 0000000..70ecd34 --- /dev/null +++ b/Sources/Transform/Collection/IdentifiedArray+.swift @@ -0,0 +1,17 @@ +import IdentifiedCollections + +public extension IdentifiedArray { + func toArray() -> [Element] { + var array: [Element] = [] + for value in self { + array.append(value) + } + return array + } +} + +public extension IdentifiedArray where Element: Hashable { + func toSet() -> Set { + toArray().toSet() + } +} diff --git a/Sources/Transform/Fundamental/Bool+.swift b/Sources/Transform/Fundamental/Bool+.swift new file mode 100644 index 0000000..ad349b4 --- /dev/null +++ b/Sources/Transform/Fundamental/Bool+.swift @@ -0,0 +1,10 @@ +public extension Bool { + + func toInt() -> Int { + self ? 1 : 0 + } + + func toString() -> String { + self ? "true" : "false" + } +} diff --git a/Sources/Transform/Fundamental/Double+.swift b/Sources/Transform/Fundamental/Double+.swift index 1432a31..ed3eb07 100644 --- a/Sources/Transform/Fundamental/Double+.swift +++ b/Sources/Transform/Fundamental/Double+.swift @@ -20,4 +20,20 @@ public extension Double { func toFloat() -> Float { toString().toFloat()! } + + func toNano() -> Double { + self * 1_000_000_000 + } + + func toGiga() -> Double { + self / 1_000_000_000 + } + + var nano: Double { + self * 1_000_000_000 + } + + var giga: Double { + self / 1_000_000_000 + } } diff --git a/Sources/Transform/Fundamental/Int+.swift b/Sources/Transform/Fundamental/Int+.swift index eac52b5..c687a6b 100644 --- a/Sources/Transform/Fundamental/Int+.swift +++ b/Sources/Transform/Fundamental/Int+.swift @@ -25,4 +25,13 @@ public extension Int { return UInt(self) } + func toNano() -> Double { + self.toDouble()/1_000_000_000 + } +} + +extension UInt64 { + public init(seconds: Double) { + self.init(seconds.nano) + } } diff --git a/Sources/Transform/Fundamental/URL+.swift b/Sources/Transform/Fundamental/URL+.swift index e683829..69db52a 100644 --- a/Sources/Transform/Fundamental/URL+.swift +++ b/Sources/Transform/Fundamental/URL+.swift @@ -4,4 +4,15 @@ public extension URL { func toString() -> String { absoluteString } + + func toQueryParameters() -> [String: String]? { + guard let queryItems = URLComponents(url: self, resolvingAgainstBaseURL: false)?.queryItems else { + return nil + } + return Dictionary(queryItems.lazy.compactMap { + guard let value = $0.value else { return nil } + return ($0.name, value) + }) { first, _ in first } + } + } diff --git a/Sources/Transform/Important/ArrayExt.swift b/Sources/Transform/Important/ArrayExt.swift index 3c295f0..577f25d 100644 --- a/Sources/Transform/Important/ArrayExt.swift +++ b/Sources/Transform/Important/ArrayExt.swift @@ -1,7 +1,17 @@ import Foundation +import IdentifiedCollections + +public extension Array { + @discardableResult + func appending(value element: Element) -> Self { + var copy = self + copy.append(element) + return copy + } +} public extension Array where Element: Equatable { - var unique: [Element] { + var removedDuplicates: [Element] { var uniqueValues: [Element] = [] forEach { item in guard !uniqueValues.contains(item) else { return } @@ -10,3 +20,25 @@ public extension Array where Element: Equatable { return uniqueValues } } + +public extension Array where Element == [String: Any] { + + func toData(options opt: JSONSerialization.WritingOptions = []) -> Data? { + try? JSONSerialization.data(withJSONObject: self, options: opt) + } +} + + +public extension Array where Element: Codable { + + func toData(options opt: JSONSerialization.WritingOptions = []) -> Data? { + compactMap({$0.toDictionary()}).toData(options: opt) + } +} + +public extension IdentifiedArray where Element: Codable { + + func toData(options opt: JSONSerialization.WritingOptions = []) -> Data? { + toArray().toData(options: opt) + } +} diff --git a/Sources/Transform/Important/DataExt.swift b/Sources/Transform/Important/DataExt.swift index 6109e4f..5fd3ddd 100644 --- a/Sources/Transform/Important/DataExt.swift +++ b/Sources/Transform/Important/DataExt.swift @@ -19,7 +19,6 @@ public extension Data { } } -#if os(iOS) func toData(keyPath: String? = nil) -> Self { guard let keyPath = keyPath else { return self @@ -38,5 +37,35 @@ public extension Data { } return self } -#endif + + func hasData(keyPath: String? = nil) -> Bool { + guard let keyPath = keyPath else { return true } + do { + let json = try JSONSerialization.jsonObject(with: self, options: []) + if let nestedJson = (json as AnyObject).value(forKeyPath: keyPath) { + guard JSONSerialization.isValidJSONObject(nestedJson) else { + return false + } + let _ = try JSONSerialization.data(withJSONObject: nestedJson) + return false + } + } catch { + return false + } + return false + } + + subscript(_ keyPath: String? = nil) -> Self? { + toData(keyPath: keyPath) + } + + func toDataPrettyPrinted() -> Self { + do { + let dataAsJSON = try JSONSerialization.jsonObject(with: self) + let prettyData = try JSONSerialization.data(withJSONObject: dataAsJSON, options: .prettyPrinted) + return prettyData + } catch { + return self // fallback to original data if it can't be serialized. + } + } } diff --git a/Sources/Transform/Important/IdentifiedArrayExt.swift b/Sources/Transform/Important/IdentifiedArrayExt.swift new file mode 100644 index 0000000..372c21b --- /dev/null +++ b/Sources/Transform/Important/IdentifiedArrayExt.swift @@ -0,0 +1,54 @@ +import IdentifiedCollections +import Foundation + +@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *) +public extension IdentifiedArray where Element: Identifiable { + + init(_ builder: () -> IdentifiedArray) { + self = builder() + } + + init(_ builder: () -> Array) where ID == Element.ID { + self = builder().toIdentifiedArray() + } +} + +@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *) +public extension Array where Element: Identifiable { + func toIdentifiedArray() -> IdentifiedArrayOf { + var identifiedArray: IdentifiedArrayOf = [] + for value in self { + identifiedArray.updateOrAppend(value) + } + return identifiedArray + } +} + +@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *) +public extension IdentifiedArray where Element: Identifiable { + + @discardableResult + mutating func updateOrAppend(_ items: Self) -> Self { + for item in items { + self.updateOrAppend(item) + } + return self + } + + @discardableResult + mutating func updateOrAppend(_ items: [Element]) -> Self { + for item in items { + self.updateOrAppend(item) + } + return self + } + + @discardableResult + mutating func updateOrAppend(ifLet item: Element?) -> Self { + guard let item = item else { + return self + } + self.updateOrAppend(item) + return self + } +} diff --git a/Sources/Transform/Important/MutableCollectionExt.swift b/Sources/Transform/Important/MutableCollectionExt.swift deleted file mode 100644 index b93fd65..0000000 --- a/Sources/Transform/Important/MutableCollectionExt.swift +++ /dev/null @@ -1,14 +0,0 @@ -import Foundation - -public extension MutableCollection { - subscript(safe index: Index) -> Element? { - get { - indices.contains(index) ? self[index] : nil - } - mutating set { - if indices.contains(index), let value = newValue { - self[index] = value - } - } - } -} diff --git a/Sources/Transform/Important/SetExt.swift b/Sources/Transform/Important/SetExt.swift index 8aa716d..b7ec423 100644 --- a/Sources/Transform/Important/SetExt.swift +++ b/Sources/Transform/Important/SetExt.swift @@ -1,5 +1,13 @@ import Foundation public extension Set { - + @discardableResult + mutating func toggle(_ element: Element) -> Element { + if self.contains(element) { + self.remove(element) + } else { + self.insert(element) + } + return element + } } diff --git a/Sources/Transform/Important/StringExt.swift b/Sources/Transform/Important/StringExt.swift index 5875f5c..6cc3974 100644 --- a/Sources/Transform/Important/StringExt.swift +++ b/Sources/Transform/Important/StringExt.swift @@ -1,7 +1,7 @@ import Foundation public extension String { - func toData(using:String.Encoding = .utf8) -> Data? { + func toData(using: String.Encoding = .utf8) -> Data? { return self.data(using: using) }