typealias Waiter<Success, Failure> = CheckedContinuation<Success, Error>

actor State<Success, Failure> {
    var waiters = [Waiter<Success, Failure>]()
    var result: Success?
    var failure: Failure?
}

extension State {
    func setResult(result: Success) {
        self.result = result
    }

    func setFailure(failure: Failure) {
        self.failure = failure
    }

    func appendWaiters(waiters: Waiter<Success, Failure>...) {
        self.waiters.append(contentsOf: waiters)
    }

    func removeAllWaiters() {
        waiters.removeAll()
    }
}