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") + + } + +}