Issue #469

If there are lots of logics and states inside a screen, it is best to introduce parent and child container, and switch child depends on state. Each child acts as a State handler.

In less logic case, we can introduce a Scenario class that holds the state. So the ViewController can be very slim. The thing with State is that all possible scenarios are clear and required to be handled

final class UserDetailScenario {
    enum State {
        case unknown
        case getUser(Email)
        case newUser(Email)
        case existingUser(User)
        case failure(Error)
    }
    
    var state: State = .unknown(nil) {
        didSet {
            self.reload()
        }
    }
    
    private func reload() {
        switch state {
        case .unknown:
            handleUnknown()
        case .getUser(let email):
            handleGetUser(email: email)
        case .newUser(let email):
            handleNewUser(email: email)
        case .existingUser(let user):
            handleExistingUser(user: user
        case .failure(let error):
            logError(error)
        }
}