                 return (self, closure)
             }
         case .asyncReceiver(let receiver):
-            let closure: ((AsyncStream, ((Void) throws -> Void) -> Void) -> Void) = { sender, result in
+            let closure: ((AsyncSendingStream, ((Void) throws -> Void) -> Void) -> Void) = { sender, result in
                 _ = AsyncDrain(for: receiver, timingOut: deadline) { getData in
                     do {
                         let drain = try getData()

                     Represents a `Data` object containing
                     a byte array.

    - receiver:      Contains a `Stream` that can be drained
                     in chunks to access the body's data.

    - sender:        Contains a closure that accepts a `Stream`
                     object to which the body's data should be sent.
 
    - asyncReceiver: Contains a `AsyncStream` that can be drained
                     in chunks to access the body's data.
 
    - asyncSender:   Contains a closure that accepts a `AsyncStream`
                     object to which the body's data should be sent.
 
*/
public enum Body {
    case buffer(Data)
    case receiver(Stream)
    case sender((Stream) throws -> Void)
    case asyncReceiver(AsyncStream)
    case asyncSender((AsyncStream, ((Void) throws -> Void) -> Void) -> Void)
}

public enum BodyError: ErrorProtocol {


    /**
        Converts the body's contents into a closure
        that accepts a `SendingStream`.
    */
    public mutating func becomeSender(timingOut deadline: Double = .never) -> ((SendingStream) throws -> Void) {
        switch self {
        case .buffer(let data):
            let closure: ((SendingStream) throws -> Void) = { sender in
                try sender.send(data, timingOut: deadline)
            }
            self = .sender(closure)
            return closure
        case .receiver(let receiver):
            let closure: ((SendingStream) throws -> Void) = { sender in
                let data = Drain(for: receiver, timingOut: deadline).data
                try sender.send(data, timingOut: deadline)
            }
