// Core types for deflate module

///|
pub typealias Int64 as UInt32

// Compression levels

///|
pub enum Level {
  None // Only non-compressed blocks
  Fast
  Default
  Best
} derive(Show)

// Helper functions to create Level values

///|
pub fn level_none() -> Level {
  Level::None
}

///|
pub fn level_fast() -> Level {
  Level::Fast
}

///|
pub fn level_default() -> Level {
  Level::Default
}

///|
pub fn level_best() -> Level {
  Level::Best
}

// Result type for operations that can fail

///|
pub enum Result[T, E] {
  Ok(T)
  Err(E)
}

// Helper function to create Ok result

///|
pub fn[T, E] ok(value : T) -> Result[T, E] {
  Ok(value)
}

// Helper function to create Err result

///|
pub fn[T, E] err(error : E) -> Result[T, E] {
  Err(error)
}

// Helper function to unwrap Result or panic

///|
pub fn[T, E] unwrap(result : Result[T, E]) -> T {
  match result {
    Ok(value) => value
    Err(_) => abort("unwrap called on Err value")
  }
}

// Helper function to unwrap Result or return default

///|
pub fn[T, E] unwrap_or(result : Result[T, E], default : T) -> T {
  match result {
    Ok(value) => value
    Err(_) => default
  }
}