import Errors
import Foundation

public enum RequestState<T> {
    case none
    case loading
    case done(Result<T, AnyError>)

    public var value: T? {
        switch self {
        case .none, .loading, .done(.failure):
            return nil

        case let .done(.success(value)):
            return value
        }
    }

    public var error: AnyError? {
        switch self {
        case .none, .loading, .done(.success):
            return nil

        case let .done(.failure(error)):
            return error
        }
    }

    public var isLoading: Bool {
        switch self {
        case .loading: true
        case .none, .done: false
        }
    }

    public var didSucceed: Bool {
        value != nil
    }

    public var didFail: Bool {
        error != nil
    }
}

extension RequestState: Equatable where T: Equatable {}
