Skip to content

Commit 535e97f

Browse files
feature: Adds async/await-based EventStream
1 parent 122c939 commit 535e97f

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

Sources/GraphQL/Subscription/EventStream.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,51 @@ open class EventStream<Element> {
66
fatalError("This function should be overridden by implementing classes")
77
}
88
}
9+
10+
#if compiler(>=5.5) && canImport(_Concurrency)
11+
12+
@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *)
13+
/// Event stream that wraps an `AsyncThrowingStream` from Swift's standard concurrency system.
14+
public class ConcurrentEventStream<Element>: EventStream<Element> {
15+
public let stream: AsyncThrowingStream<Element, Error>
16+
17+
public init(_ stream: AsyncThrowingStream<Element, Error>) {
18+
self.stream = stream
19+
}
20+
21+
/// Performs the closure on each event in the current stream and returns a stream of the results.
22+
/// - Parameter closure: The closure to apply to each event in the stream
23+
/// - Returns: A stream of the results
24+
override open func map<To>(_ closure: @escaping (Element) throws -> To) -> ConcurrentEventStream<To> {
25+
let newStream = self.stream.mapStream(closure)
26+
return ConcurrentEventStream<To>.init(newStream)
27+
}
28+
}
29+
30+
@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *)
31+
extension AsyncThrowingStream {
32+
func mapStream<To>(_ closure: @escaping (Element) throws -> To) -> AsyncThrowingStream<To, Error> {
33+
return AsyncThrowingStream<To, Error> { continuation in
34+
Task {
35+
for try await event in self {
36+
let newEvent = try closure(event)
37+
continuation.yield(newEvent)
38+
}
39+
}
40+
}
41+
}
42+
43+
func filterStream(_ isIncluded: @escaping (Element) throws -> Bool) -> AsyncThrowingStream<Element, Error> {
44+
return AsyncThrowingStream<Element, Error> { continuation in
45+
Task {
46+
for try await event in self {
47+
if try isIncluded(event) {
48+
continuation.yield(event)
49+
}
50+
}
51+
}
52+
}
53+
}
54+
}
55+
56+
#endif

0 commit comments

Comments
 (0)