用于增强 Swift 语言的框架集合。
注意:此软件包尚处于早期 beta 阶段
此软件包将吸取最初版本的精华
此库应被视为实验性的。但我们热爱语义化版本控制 (semver),因此如果您依赖版本而不是分支,应该不会有任何意外。
如果由于您依赖旧的 main
或 develop
分支而导致某些问题,请使用版本 0.0.3
,它应该无需额外工作即可解决问题。
import PackageDescription
let package = Package(
dependencies: [
.package(
url: "https://github.com/capturecontext/swift-prelude.git",
.upToNextMinor(from: "0.2.0")
),
]
)
用于构建强大的抽象和增强 Swift 标准库的类型和函数集合。
一种表达持有两种其他类型之一的值的类型。
import Either
let intOrString = Either<Int, String>.left(2)
intOrString
.bimap({ $0 + 1 }, { $0 + "!" }) // => .left(3)
一种 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
是半群时,它被赋予不同的 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。