diff --git a/.swiftpm/xcode/xcshareddata/xcschemes/Wrap.xcscheme b/.swiftpm/xcode/xcshareddata/xcschemes/Wrap.xcscheme
new file mode 100644
index 0000000..8646164
--- /dev/null
+++ b/.swiftpm/xcode/xcshareddata/xcschemes/Wrap.xcscheme
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Package.swift b/Package.swift
index b0f6eb8..914a025 100644
--- a/Package.swift
+++ b/Package.swift
@@ -8,6 +8,7 @@ let package = Package(
],
targets: [
.target(name: "Wrap", dependencies: []),
+ .testTarget(name: "WrapTests", dependencies: ["Wrap"])
],
swiftLanguageVersions: [.v5]
)
diff --git a/Sources/Wrap/Wrap.swift b/Sources/Wrap/Wrap.swift
index d19beeb..e3433f6 100644
--- a/Sources/Wrap/Wrap.swift
+++ b/Sources/Wrap/Wrap.swift
@@ -1,47 +1,47 @@
-
-postfix operator &>
-
-public postfix func &> (argument: T) -> Wrap {
- .init(argument)
+precedencegroup WrapPrecedence {
+ associativity: left
}
-public struct Wrap {
-
- public let value: Value
+infix operator &>: WrapPrecedence
+infix operator <&: WrapPrecedence
- public init(_ value: Value) {
- self.value = value
- }
-
+public func <& (lhs: inout T, modifier: WrapModifier) -> O {
+ modifier.modify(&lhs)
}
-public func modify(_ value: inout Value, _ modifier: (inout Value) -> Void) {
- modifier(&value)
+@discardableResult
+public func &> (lhs: T, applier: WrapApplier) -> O {
+ applier.apply(lhs)
}
-extension Wrap {
-
- public func map(_ transform: (Value) throws -> U) rethrows -> U {
- try transform(value)
- }
-
- @discardableResult
- public func `do`(_ applier: (Value) throws -> Void) rethrows -> Value where Value : AnyObject {
- try applier(value)
- return value
+public struct WrapModifier {
+
+ public let modify: (inout Input) -> Output
+
+ public init(_ modify: @escaping (inout Input) -> Output) {
+ self.modify = modify
}
- public func modify(_ modifier: (inout Value) throws -> Void) rethrows -> Value {
- var v = value
- try modifier(&v)
- return v
+ public static func modify(_ modify: @escaping (inout Input) -> Void) -> WrapModifier {
+ return .init {
+ modify(&$0)
+ }
}
+
+}
- public func filter(_ filter: (Value) -> Bool) -> Value? {
- guard filter(value) else {
- return nil
+public struct WrapApplier {
+
+ public let apply: (Input) -> Output
+
+ public init(_ apply: @escaping (Input) -> Output) {
+ self.apply = apply
+ }
+
+ public static func `do`(_ applier: @escaping (Input) -> Void) -> WrapApplier {
+ return .init {
+ applier($0)
+ return $0
}
- return value
}
-
}
diff --git a/Tests/WrapTests/Tests.swift b/Tests/WrapTests/Tests.swift
new file mode 100644
index 0000000..45c8473
--- /dev/null
+++ b/Tests/WrapTests/Tests.swift
@@ -0,0 +1,23 @@
+import XCTest
+
+import Wrap
+
+final class Tests: XCTestCase {
+
+ func testApplier() {
+
+ "1" &> .do {
+ XCTAssertEqual($0, "1")
+ }
+
+ var text = ""
+
+ text <& .modify {
+ $0 = "muuk"
+ }
+
+ XCTAssertEqual(text, "muuk")
+
+ }
+
+}