// AsyncState - Environment-agnostic async state representation

///|
/// Async state representation - environment independent
pub(all) enum AsyncState[T] {
  Pending
  Success(T)
  Failure(String)
}

///|
/// Check if state is pending
pub fn[T] AsyncState::is_pending(self : AsyncState[T]) -> Bool {
  match self {
    Pending => true
    _ => false
  }
}

///|
/// Check if state is success
pub fn[T] AsyncState::is_success(self : AsyncState[T]) -> Bool {
  match self {
    Success(_) => true
    _ => false
  }
}

///|
/// Check if state is failure
pub fn[T] AsyncState::is_failure(self : AsyncState[T]) -> Bool {
  match self {
    Failure(_) => true
    _ => false
  }
}

///|
/// Get value if success, None otherwise
pub fn[T] AsyncState::value(self : AsyncState[T]) -> T? {
  match self {
    Success(v) => Some(v)
    _ => None
  }
}

///|
/// Get error if failure, None otherwise
pub fn[T] AsyncState::error(self : AsyncState[T]) -> String? {
  match self {
    Failure(e) => Some(e)
    _ => None
  }
}