SwiftPipeline

Swift Package Manager

SwiftPipeline 是一个轻量级的 Swift 函数式库,它借鉴了 ClojureHaskell 等语言的灵感,带来了强大的线程宏函数式操作符。 通过简洁而富有表现力的操作符,SwiftPipeline 允许您以简洁易懂的方式将数据通过一系列转换进行传递。

特性 🎯

线程操作符

函数式操作符

为什么选择 SwiftPipeline? 🤔

简洁且声明式的代码

丰富的函数式编程模式

轻量级且原生 Swift

灵活且可扩展

经过实战考验的模式

团队的理想选择

无论您是构建数据管道、处理可选链,还是仅仅想要更简洁的代码,SwiftPipeline 都提供了您需要的工具,而没有臃肿。

安装 📥

使用 Swift Package Manager 将 SwiftPipeline 添加到您的项目中

  1. 在 Xcode 中打开您的项目
  2. 转到 File > Add Packages
  3. 输入以下存储库 URL
    https://github.com/Maartz/SwiftPipeline.git
    
  4. 选择最新版本并添加包

用法 📖

基本线程操作符

Thread-first (=>)

struct Person {
    let name: String
    let age: Int
}

let person = Person(name: "Alice", age: 30)
let result = person
    => \.name
    => { $0.uppercased() }
// Output: "ALICE"

Thread-last (=>>)

let numbers = [1, 2, 3]
let result = numbers
    =>> { $0.map { $0 + 1 } }
    =>> { $0.filter { $0 % 2 != 0 } }
    =>> { $0.reduce(0, +) }
// Output: 6

Thread-as (~=>)

let total = 5 
    ~=> { x in x + 10 } 
    => { $0 * 2 }
// Output: 30

函数式操作符

Map (<|)

// 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]

Applicative (<*>)

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]

Alternative (<|>)

let parseNumber: (String) -> Int? = { Int($0) }
let result = parseNumber("invalid") <|> parseNumber("42") <|> Some(0)
// Falls back to valid parsing or default

Monadic Bind (>>-) 和 Reverse Bind (-<<)

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

复杂示例

带 Alternatives 的可选链

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

带 Computations 的 Applicative

let compute: (Int) -> (Int) -> Int? = { x in 
    { y in (x + y) > 0 ? x + y : nil } 
}

let result = (parseId -<< "5" >>- compute) 
    <*> Some(-3) 
    <|> Some(10)

API 参考 📚

操作符

操作符 类型 描述 示例用法
=> 线程 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! 🚀