SwiftPipeline 是一个轻量级的 Swift 函数式库,它借鉴了 Clojure 和 Haskell 等语言的灵感,带来了强大的线程宏和函数式操作符。 通过简洁而富有表现力的操作符,SwiftPipeline 允许您以简洁易懂的方式将数据通过一系列转换进行传递。
=>
): 将值作为函数的第一个参数传递,或使用 KeyPath 提取属性=>>
): 将值作为函数的最后一个参数传递~=>
): 将值绑定到一个名称,用于自定义转换<|
): 将函数应用于可选值或数组<*>
): 将包装后的函数应用于包装后的值>=>
): 组合返回可选值的函数<|>
): 为计算提供备用值>>-
): 链接生成可选值的操作-<<
): Monadic bind 的翻转版本无论您是构建数据管道、处理可选链,还是仅仅想要更简洁的代码,SwiftPipeline 都提供了您需要的工具,而没有臃肿。
使用 Swift Package Manager 将 SwiftPipeline 添加到您的项目中
https://github.com/Maartz/SwiftPipeline.git
struct Person {
let name: String
let age: Int
}
let person = Person(name: "Alice", age: 30)
let result = person
=> \.name
=> { $0.uppercased() }
// Output: "ALICE"
let numbers = [1, 2, 3]
let result = numbers
=>> { $0.map { $0 + 1 } }
=>> { $0.filter { $0 % 2 != 0 } }
=>> { $0.reduce(0, +) }
// Output: 6
let total = 5
~=> { x in x + 10 }
=> { $0 * 2 }
// Output: 30
// With optionals
let double: (Int) -> Int = { $0 * 2 }
let result = double <| Some(5) // Optional(10)
// With arrays
let numbers = [1, 2, 3]
let doubled = double <| numbers // [2, 4, 6]
let maybeDouble: ((Int) -> Int)? = { $0 * 2 }
let result = maybeDouble <*> Some(5) // Optional(10)
// With arrays
let functions = [{ $0 * 2 }, { $0 + 3 }]
let values = [1, 2]
let results = functions <*> values // [2, 4, 4, 5]
let parseNumber: (String) -> Int? = { Int($0) }
let result = parseNumber("invalid") <|> parseNumber("42") <|> Some(0)
// Falls back to valid parsing or default
let parseId: (String) -> Int? = { Int($0) }
let findUser: (Int) -> User? = { id in
// Find user by id
id == 42 ? User(id: 42, name: "John") : nil
}
// Using >>-
let user1 = "42" >>- parseId >>- findUser
// Using -<<
let user2 = findUser -<< (parseId -<< "42")
struct User {
let id: Int
let email: String?
}
let validateEmail: (String) -> String? = { email in
email.contains("@") ? email : nil
}
let result = parseId -<< "42"
>>- findUser
>>- { user in user.email >>- validateEmail }
<|> Some("default@email.com")
let compute: (Int) -> (Int) -> Int? = { x in
{ y in (x + y) > 0 ? x + y : nil }
}
let result = (parseId -<< "5" >>- compute)
<*> Some(-3)
<|> Some(10)
操作符 | 类型 | 描述 | 示例用法 |
---|---|---|---|
=> |
线程 | Thread-first | value => function |
=>> |
线程 | Thread-last | value =>> function |
~=> |
线程 | Thread-as | value ~=> { $0 * 2 } |
<| |
函数式 | Map | function <| optional |
<*> |
函数式 | Applicative | wrappedFn <*> wrappedValue |
>=> |
函数式 | Kleisli 组合 | f >=> g |
<|> |
函数式 | Alternative | computation1 <|> computation2 |
>>- |
函数式 | Monadic bind | value >>- function |
-<< |
函数式 | Reverse bind | function -<< value |
我们欢迎贡献! 随意
本项目基于 MIT 许可证。 有关详细信息,请参见 LICENSE 文件。
SwiftPipeline 的灵感来自 Clojure 的线程宏和 Haskell 的函数式操作符,旨在将类似的功能引入 Swift 生态系统。
享受使用 SwiftPipeline! 🚀