From 5664b31d1470c253c753b4a94fc0f49239582a9d Mon Sep 17 00:00:00 2001 From: David Roman <2538074+davdroman@users.noreply.github.com> Date: Tue, 14 Jun 2022 13:39:44 +0100 Subject: [PATCH 1/4] Remove unneeded import --- Sources/TextBuilder/TextBuilderSeparator.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/Sources/TextBuilder/TextBuilderSeparator.swift b/Sources/TextBuilder/TextBuilderSeparator.swift index b8714c2..89ed129 100644 --- a/Sources/TextBuilder/TextBuilderSeparator.swift +++ b/Sources/TextBuilder/TextBuilderSeparator.swift @@ -1,5 +1,3 @@ -import Foundation - public protocol TextBuilderSeparator { associatedtype Separator: StringProtocol static var separator: Separator { get } From ace3b8ef2f82c6e5f52830292e475a4b91fb9395 Mon Sep 17 00:00:00 2001 From: David Roman <2538074+davdroman@users.noreply.github.com> Date: Tue, 14 Jun 2022 13:42:33 +0100 Subject: [PATCH 2/4] Add `swift-builders` dependency --- Package.resolved | 9 +++++++++ Package.swift | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Package.resolved b/Package.resolved index f3cc78c..1283f6e 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,6 +1,15 @@ { "object": { "pins": [ + { + "package": "swift-builders", + "repositoryURL": "https://github.com/davdroman/swift-builders", + "state": { + "branch": null, + "revision": "08d96a63dd74b8efb87987b177bfe762accf279e", + "version": "0.1.0" + } + }, { "package": "SnapshotTesting", "repositoryURL": "https://github.com/pointfreeco/swift-snapshot-testing", diff --git a/Package.swift b/Package.swift index bb569ef..d7d9c5a 100644 --- a/Package.swift +++ b/Package.swift @@ -15,7 +15,9 @@ let package = Package( .library(name: "TextBuilder", targets: ["TextBuilder"]), ], targets: [ - .target(name: "TextBuilder"), + .target(name: "TextBuilder", dependencies: [ + .product(name: "Builders", package: "swift-builders"), + ]), .testTarget( name: "TextBuilderTests", dependencies: [ @@ -31,4 +33,5 @@ let package = Package( package.dependencies = [ .package(name: "SnapshotTesting", url: "https://github.com/pointfreeco/swift-snapshot-testing", from: "1.8.2"), + .package(name: "swift-builders", url: "https://github.com/davdroman/swift-builders", from: "0.1.0"), ] From 8e1d35737558c64f29934272d71bdeb35c62f646 Mon Sep 17 00:00:00 2001 From: David Roman <2538074+davdroman@users.noreply.github.com> Date: Tue, 14 Jun 2022 13:45:05 +0100 Subject: [PATCH 3/4] Gardening --- Sources/TextBuilder/TextExtensions.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/Sources/TextBuilder/TextExtensions.swift b/Sources/TextBuilder/TextExtensions.swift index 55cfc54..24e2503 100644 --- a/Sources/TextBuilder/TextExtensions.swift +++ b/Sources/TextBuilder/TextExtensions.swift @@ -5,7 +5,6 @@ extension StringProtocol { } extension Sequence where Element == Text { - /// Returns a new `Text` by concatenating the elements of the sequence, /// /// The following example shows how an array of `Text` views can be joined to a @@ -31,7 +30,6 @@ extension Sequence where Element == Text { } extension Text { - /// Creates a combined text view based on the given `content` by inserting /// `separator` text views between each received text component. /// From 2d5df8daef39ac80d92257345c2d1a33eb79b3c0 Mon Sep 17 00:00:00 2001 From: David Roman <2538074+davdroman@users.noreply.github.com> Date: Tue, 14 Jun 2022 13:52:12 +0100 Subject: [PATCH 4/4] Use array builder for `Text.init(separator:content:)` --- Sources/TextBuilder/TextBuilder.swift | 4 ---- Sources/TextBuilder/TextExtensions.swift | 11 +++++++---- .../TextBuilderTests/TextExtensionsTests.swift | 18 +++++++++--------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/Sources/TextBuilder/TextBuilder.swift b/Sources/TextBuilder/TextBuilder.swift index 7f2d1ca..f89b0ce 100644 --- a/Sources/TextBuilder/TextBuilder.swift +++ b/Sources/TextBuilder/TextBuilder.swift @@ -56,8 +56,4 @@ public struct TextBuilder { public static func buildFinalResult(_ texts: [Text]) -> Text { texts.joined(separator: Text(Separator.separator)) } - - public static func buildFinalResult(_ texts: [Text]) -> [Text] { - texts - } } diff --git a/Sources/TextBuilder/TextExtensions.swift b/Sources/TextBuilder/TextExtensions.swift index 24e2503..4842107 100644 --- a/Sources/TextBuilder/TextExtensions.swift +++ b/Sources/TextBuilder/TextExtensions.swift @@ -1,3 +1,4 @@ +import Builders import SwiftUI extension StringProtocol { @@ -29,6 +30,8 @@ extension Sequence where Element == Text { } } +public typealias TextArrayBuilder = ArrayBuilder + extension Text { /// Creates a combined text view based on the given `content` by inserting /// `separator` text views between each received text component. @@ -36,8 +39,8 @@ extension Text { /// - Parameters: /// - separator: The text to use as a separator between received text components. /// By default there is no separator. - /// - content: A text builder that creates text components. - public init(separator: Text = Text(""), @BasicTextBuilder content: () -> [Text]) { + /// - content: A text array builder that creates text components. + public init(separator: Text = Text(""), @TextArrayBuilder content: () -> [Text]) { self = content().joined(separator: separator) } @@ -46,8 +49,8 @@ extension Text { /// /// - Parameters: /// - separator: The string to use as a separator between received text components. - /// - content: A text builder that creates text components. - public init(separator: Separator, @BasicTextBuilder content: () -> [Text]) { + /// - content: A text array builder that creates text components. + public init(separator: Separator, @TextArrayBuilder content: () -> [Text]) { self.init(separator: Text(separator), content: content) } } diff --git a/Tests/TextBuilderTests/TextExtensionsTests.swift b/Tests/TextBuilderTests/TextExtensionsTests.swift index 5bcb434..f82176f 100644 --- a/Tests/TextBuilderTests/TextExtensionsTests.swift +++ b/Tests/TextBuilderTests/TextExtensionsTests.swift @@ -24,31 +24,31 @@ final class TextExtensionsTests: XCTestCase { func testInit_noSeparator() { assertTextSnapshot( - Text(content: basicTextBuilderText) + Text(content: textArrayBuilderText) ) assertTextSnapshot( - Text(separator: Text(""), content: basicTextBuilderText) + Text(separator: Text(""), content: textArrayBuilderText) ) assertTextSnapshot( - Text(separator: "", content: basicTextBuilderText) + Text(separator: "", content: textArrayBuilderText) ) } func testInit_spaceSeparator() { assertTextSnapshot( - Text(separator: Text(" "), content: basicTextBuilderText) + Text(separator: Text(" "), content: textArrayBuilderText) ) assertTextSnapshot( - Text(separator: " ", content: basicTextBuilderText) + Text(separator: " ", content: textArrayBuilderText) ) } func testInit_newlineSeparator() { assertTextSnapshot( - Text(separator: Text("\n"), content: basicTextBuilderText) + Text(separator: Text("\n"), content: textArrayBuilderText) ) assertTextSnapshot( - Text(separator: "\n", content: basicTextBuilderText) + Text(separator: "\n", content: textArrayBuilderText) ) } } @@ -63,8 +63,8 @@ private extension TextExtensionsTests { ] } - @BasicTextBuilder - func basicTextBuilderText() -> [Text] { + @TextArrayBuilder + func textArrayBuilderText() -> [Text] { Text("Lorem").underline().foregroundColor(.blue) Text("ipsum dolor") Text("sit").bold()