All equality expressions in this document return true
:
import OptionalSubscripts
var 📦: Any?
📦 = nil
📦 = []
📦 = [:]
📦[] = "👋"
try 📦[] == "👋"
📦["one"] = 1
try 📦["one"] == 1
📦["one", 2] = 2
try 📦["one", 2] == 2
📦["one", 10] = nil
try 📦["one"] as [Int?] == [nil, nil, 2]
📦["one", 2] = ["three": 4]
try 📦["one", 2, "three"] == 4
try 📦[\.["one"][2]["three"]] == 4
📦["one", 2] = nil
📦["one"] == nil
📦["one", "two"] = nil
📦[] == nil
The package includes Any?.Store
actor with routed streams, publishers, batch updates and atomic transactions:
let o = Any?.Store()
let stream = await o.stream("me", 2, "you").filter(String.self).prefix(3)
Task {
var hearts: [String] = []
for await o in stream {
hearts.append(o)
}
hearts == ["❤️", "💛", "💚"]
}
await o.set("me", 2, "you", to: "❤️")
await o.set("me", 2, to: ["you": "💛"])
await o.set("me", to: [nil, nil, ["you": "💚"]])
The package also includes Any?.Pond
actor that turns a chunky data source (like a document-oriented database) into routed data streams of arbitrary granularity:
let db = SomeDatabase() // conforms to Geyser protocol and streams entire documents
let pond = Any?.Pond(source: db)
await db.store.set("v/2.0/way/to", "my", "heart", to: "🤍")
var hearts = ""
loop:
for await heart in pond.stream("way", "to", "my", "heart").filter(String?.self) {
// observing a nested field in a versioned document ↑
hearts += heart ?? ""
switch heart {
case nil where hearts.isEmpty:
await db.store.set("v/1.0/way/to", "my", "heart", to: "❤️")
case "❤️": await db.store.set("v/1.0/way/to", "my", "heart", to: "💛")
case "💛": await db.store.set("v/1.0/way/to", "my", "heart", to: "💚")
case "💚": await db.setVersion(to: "v/2.0/")
case "🤍": break loop
default: assertionFailure()
}
}
hearts == "❤️💛💚🤍"
await pond.gushSources["v/1.0/way/to"]?.referenceCount == nil
await pond.gushSources["v/2.0/way/to"]?.referenceCount == 1
... where:
protocol Geyser {
associatedtype GushID: Hashable
associatedtype Gushes: AsyncSequence where Gushes.Element == Any?
associatedtype GushToRouteMapping: AsyncSequence where GushToRouteMapping.Element == (id: GushID, route: Optional<Any>.Route)?
func stream(_ gush: GushID) async -> Gushes
func source<Route>(of route: Route) async -> GushToRouteMapping where Route: Collection, Route.Index == Int, Route.Element == Optional<Any>.Location
}
And a bunch of other (hopefully) useful new API.
(Decent documentation and an overall statement of purpose is forthcoming 😜)