一系列框架,旨在增强 Swift 语言。
这个库应被视为实验性的。如果您发现其内容有用,请考虑维护一个分支。
import PackageDescription
let package = Package(
dependencies: [
.package(url: "https://github.com/pointfreeco/swift-prelude.git", .branch("main")),
]
)
一组类型和函数,用于构建强大的抽象并增强 Swift 标准库。
一种类型,用于表达包含两种其他类型之一的值。
import Either
let intOrString = Either<Int, String>.left(2)
intOrString
.bimap({ $0 + 1 }, { $0 + "!" }) // => .left(3)
一个 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")
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’ 的 演讲。
此 Validation<E, A>
类型类似于 Result<E, A>
类型和上述 Validation
,不同之处在于,如果 E
是一个 NearSemiring
,它会被赋予不同的 applicative 实例。 这允许您累积描述同时满足“和”和“或”条件的错误,例如,需要姓名并且需要电子邮件或电话。
所有模块均在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE。