一个用 Swift 实现的 Clojure 的 持久化向量。
已经实现了核心操作,例如 conj
、assoc
、get
(使用下标)、subvec
(使用下标)和 concat
。
let v: PersistentVector = ["a", "b", "c"]
let v2 = v.conj("d").assoc(index: 2, "C")
XCTAssertEqual(v, ["a", "b", "c"])
XCTAssertEqual(v2, ["a", "b", "C", "d"])
XCTAssert(v.pop() == v2[0..<2])
XCTAssertEqual(v.map {$0.uppercased()}, ["A", "B", "C"])
XCTAssertEqual(v[1], "b")
XCTAssertEqual(Array(v[1...2]), ["b", "c"])
包含瞬态向量
let v: PersistentVector = ["a", "b", "c"]
var tmp = v.transient()
tmp = tmp.pop()
tmp = tmp.conj("3")
tmp = tmp.conj("4")
XCTAssert(tmp.persistent() == ["a", "b", "3", "4"])
您可以使用 Swift-Package Manager 来集成 Ruminant。
在 Package.swift
中添加以下依赖项
dependencies: [
.package(url: "https://github.com/jdevuyst/ruminant", from: "1.0.7")
],
这是一个使用 Swift Package Manager 来使用此库的示例。
首先,从 CLI 创建一个名为 “Sample” 的全新目录,然后 cd
进入该目录。
mkdir sample
cd sample
接下来,在该目录中创建一个新的可执行 swift 模板。
swift package init --type executable
现在是更新 Package.swift
的时候了。
// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "sample",
dependencies: [
// Dependencies declare other packages that this package depends on.
.package(url: "https://github.com/jdevuyst/ruminant", from: "1.0.7")
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "sample",
dependencies: ["ruminant"])
]
)
让我们安装新的依赖项。
swift package update
我们还将更新 Main.swift
以测试是否可以加载 Ruminant。
import ruminant
print("Hello, Persistent Vector!")
let sample = PersistentVector([1,2,3,4]).conj(45).conj(42)
print(sample)
最后,我们可以从命令行构建并运行该程序。
swift build
swift run
Hello, Persistent Vector!
[1, 2, 3, 4, 45, 42]
就这样。享受持久化数据结构的世界吧!
版权所有 © 2015 Jonas De Vuyst
根据 Eclipse Public License 1.0 版或(由您选择)任何后续版本分发。