swift-prelude

Swift 5.1 CI @pointfreeco

一系列框架,旨在增强 Swift 语言。

稳定性

这个库应被视为实验性的。如果您发现其内容有用,请考虑维护一个分支。

安装

import PackageDescription

let package = Package(
  dependencies: [
    .package(url: "https://github.com/pointfreeco/swift-prelude.git", .branch("main")),
  ]
)

目录

Prelude

一组类型和函数,用于构建强大的抽象并增强 Swift 标准库。

Either

一种类型,用于表达包含两种其他类型之一的值。

import Either

let intOrString = Either<Int, String>.left(2)

intOrString
  .bimap({ $0 + 1 }, { $0 + "!" }) // => .left(3)

Optics

一个 Lens 类型以及 lens 世界和 Swift 键路径世界之间的桥梁。

import Optics
import Prelude

struct User {
  var id: Int
  var name: String
}

let uppercased: (String) -> String = { $0.uppercased() }

let user = User(id: 1, name: "Blob")

user
  |> \.id .~ 2
  |> \.name %~ uppercased

// => User(2, "BLOB")

ValidationSemigroup

Validation<E, A> 类型类似于 Result<E, A> 类型,不同之处在于,如果 E 是一个 semigroup,它会被赋予不同的 applicative 实例。 这允许您将多个错误累积到 E 中,而不是只获取第一个错误。

import Prelude
import ValidationSemigroup

struct User { let name: String; let bio: String; let email: String }
let createUser = { name in { bio in { email in User(name: name, bio: bio, email: email) } } }

func validate(name: String) -> Validation<[String], String> {
  return !name.isEmpty
    ? pure(name)
    : .invalid(["Name must be at least 1 character."])
}

func validate(bio: String) -> Validation<[String], String> {
  return bio.count <= 10
    ? pure(bio)
    : .invalid(["Bio must 10 characters or less."])
}

func validate(email: String) -> Validation<[String], String> {
  return email.contains("@")
    ? pure(email)
    : .invalid(["Email must be valid."])
}

let validUser = pure(createUser)
  <*> validate(name: "Blob")
  <*> validate(bio: "I'm a blob")
  <*> validate(email: "blob@pointfree.co")
// => .valid(User(name: "Blob", bio: "I'm a blob", email: "blob@pointfree.co"))

let invalidUser = pure(createUser)
  <*> validate(name: "Blob")
  <*> validate(bio: "Blobbin around the world")
  <*> validate(email: "blob")
// => .invalid(["Bio must 10 characters or less.", "Email must be valid."])

欲了解更多信息,请观看 Stephen Celis’演讲

ValidationNearSemiring

Validation<E, A> 类型类似于 Result<E, A> 类型和上述 Validation,不同之处在于,如果 E 是一个 NearSemiring,它会被赋予不同的 applicative 实例。 这允许您累积描述同时满足“和”和“或”条件的错误,例如,需要姓名并且需要电子邮件电话。

许可证

所有模块均在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE