swift-prelude

用于增强 Swift 语言的框架集合。

注意:此软件包尚处于早期 beta 阶段

此软件包将吸取最初版本的精华

稳定性

安装

import PackageDescription

let package = Package(
  dependencies: [
    .package(
      url: "https://github.com/capturecontext/swift-prelude.git",
      .upToNextMinor(from: "0.2.0")
    ),
  ]
)

目录

Prelude

用于构建强大的抽象和增强 Swift 标准库的类型和函数集合。

Either

一种表达持有两种其他类型之一的值的类型。

import Either

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

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

Optics

一种 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 是半群时,它被赋予不同的 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 的类型,但当 ENearSemiring 时,它被赋予不同的 applicative 实例。这允许您累积描述同时满足“与”和“或”条件的错误,例如,名称是必需的 电子邮件 电话是必需的。

许可证

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