///|
pub type NonEmptyString String derive(Eq, Compare)

///|
pub impl FromString for NonEmptyString with from_string(str) {
  if DEBUGGER {
    guard str.length() > 0 else { abort("input is an empty string") }
  }
  NonEmptyString(str)
}

///|
pub fn NonEmptyString::of(str : String) -> NonEmptyString {
  NonEmptyString::from_string(str)
}

///|
pub impl Show for NonEmptyString with output(self, output) {
  self.inner().output(output)
}

///|
pub impl Show for NonEmptyString with to_string(self) {
  self.inner()
}

///|
pub impl Semigroup for NonEmptyString with op_add(a, b) {
  a.inner() + b.inner()
}

///|
pub impl Length for NonEmptyString with length(str) {
  str.inner().length()
}

///|
pub impl GetChar for NonEmptyString with op_get(str, index) {
  str.inner().charcode_at(index).unsafe_to_char()
}