//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2020 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// import Swift @_implementationOnly import _SwiftConcurrencyShims /// A partial task is a unit of scheduleable work. @frozen public struct PartialAsyncTask { private var context: Builtin.Job public func run() { } } @frozen public struct UnsafeContinuation { @usableFromInline internal var context: Builtin.RawUnsafeContinuation @_alwaysEmitIntoClient internal init(_ context: Builtin.RawUnsafeContinuation) { self.context = context } @_silgen_name("swift_continuation_resume") public func resume(returning value: __owned T) } @frozen public struct UnsafeThrowingContinuation { @usableFromInline internal var context: Builtin.RawUnsafeContinuation @_alwaysEmitIntoClient internal init(_ context: Builtin.RawUnsafeContinuation) { self.context = context } @_silgen_name("swift_continuation_throwingResume") public func resume(returning: __owned T) @_silgen_name("swift_continuation_throwingResumeWithError") public func resume(throwing: __owned Error) } #if _runtime(_ObjC) // Intrinsics used by SILGen to resume or fail continuations // for @_alwaysEmitIntoClient internal func _resumeUnsafeContinuation( _ continuation: UnsafeContinuation, _ value: __owned T ) { continuation.resume(returning: value) } @_alwaysEmitIntoClient internal func _resumeUnsafeThrowingContinuation( _ continuation: UnsafeThrowingContinuation, _ value: __owned T ) { continuation.resume(returning: value) } @_alwaysEmitIntoClient internal func _resumeUnsafeThrowingContinuationWithError( _ continuation: UnsafeThrowingContinuation, _ error: __owned Error ) { continuation.resume(throwing: error) } #endif /// The operation functions must resume the continuation *exactly once*. /// /// The continuation will not begin executing until the operation function returns. @_alwaysEmitIntoClient public func withUnsafeContinuation( _ fn: (UnsafeContinuation) -> Void ) async -> T { return await Builtin.withUnsafeContinuation { fn(UnsafeContinuation($0)) } } /// The operation functions must resume the continuation *exactly once*. /// /// The continuation will not begin executing until the operation function returns. @_alwaysEmitIntoClient public func withUnsafeThrowingContinuation( _ fn: (UnsafeThrowingContinuation) -> Void ) async throws -> T { return try await Builtin.withUnsafeThrowingContinuation { fn(UnsafeThrowingContinuation($0)) } }