AsyncSequenceOfOne.swift 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * Copyright 2023, gRPC Authors All rights reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. extension RPCAsyncSequence {
  17. /// Returns an ``RPCAsyncSequence`` containing just the given element.
  18. @inlinable
  19. static func one(_ element: Element) -> Self {
  20. let source = AsyncSequenceOfOne<Element, Failure>(result: .success(element))
  21. return RPCAsyncSequence(wrapping: source)
  22. }
  23. /// Returns an ``RPCAsyncSequence`` throwing the given error.
  24. @inlinable
  25. static func throwing(_ error: Failure) -> Self {
  26. let source = AsyncSequenceOfOne<Element, Failure>(result: .failure(error))
  27. return RPCAsyncSequence(wrapping: source)
  28. }
  29. }
  30. /// An `AsyncSequence` of a single value.
  31. @usableFromInline
  32. struct AsyncSequenceOfOne<Element: Sendable, Failure: Error>: AsyncSequence, Sendable {
  33. @usableFromInline
  34. let result: Result<Element, Failure>
  35. @inlinable
  36. init(result: Result<Element, Failure>) {
  37. self.result = result
  38. }
  39. @inlinable
  40. func makeAsyncIterator() -> AsyncIterator {
  41. AsyncIterator(result: self.result)
  42. }
  43. @usableFromInline
  44. struct AsyncIterator: AsyncIteratorProtocol {
  45. @usableFromInline
  46. private(set) var result: Result<Element, Failure>?
  47. @inlinable
  48. init(result: Result<Element, Failure>) {
  49. self.result = result
  50. }
  51. @inlinable
  52. mutating func next(
  53. isolation actor: isolated (any Actor)?
  54. ) async throws(Failure) -> Element? {
  55. guard let result = self.result else { return nil }
  56. self.result = nil
  57. return try result.get()
  58. }
  59. @inlinable
  60. mutating func next() async throws -> Element? {
  61. try await self.next(isolation: nil)
  62. }
  63. }
  64. }