      - SeeAlso: Has parity with non-static method
      */
     @discardableResult
-    public static func utility(after seconds: Double? = nil, block: @convention(block) () -> Swift.Void) -> Async {
+    public static func utility<O>(after seconds: Double? = nil, _ block: (Void) -> O) -> AsyncBlock<Void, O> {
         return Async.async(after: seconds, block: block, queue: .utility)
     }
 

    - SeeAlso: Has parity with non-static method
    */
    @discardableResult
    public static func main(after seconds: Double? = nil, block: @convention(block) () -> Swift.Void) -> Async {
        return Async.async(after: seconds, block: block, queue: .main)
    }

    /**


     - returns: An `Async` struct which encapsulates the `@convention(block) () -> Swift.Void`
     */

    private static func async<O>(after seconds: Double? = nil, block: (Void) -> O, queue: GCD) -> AsyncBlock<Void, O> {
        let reference = Reference<O>()
        let block = DispatchWorkItem(block: {
            reference.value = block()
        })

        if let seconds = seconds {
            let time = DispatchTime.now() + seconds
            queue.queue.asyncAfter(deadline: time, execute: block)
        } else {
            queue.queue.async(execute: block)
        }

        // Wrap block in a struct since @convention(block) () -> Swift.Void can't be extended
        return AsyncBlock<Void, O>(block, output: reference)
    }


