///|
extern type Symbol

///|
pub fn Symbol::make() -> Symbol {
  Symbol::make_ffi(Value::undefined()).cast()
}

///|
pub fn Symbol::make_with_string_js(value : String) -> Symbol {
  Symbol::make_ffi(Value::cast_from(value)).cast()
}

///|
pub fn Symbol::make_with_string(value : String) -> Symbol {
  Symbol::make_with_string_js(value)
}

///|
pub fn Symbol::make_with_number(num : Double) -> Symbol {
  Symbol::make_ffi(Value::cast_from(num)).cast()
}

///|
extern "js" fn Symbol::make_ffi(value : Value) -> Value =
  #| (value) => Symbol(value)

///|
extern "js" fn Symbol::iterator_ffi() -> Value =
  #| () => Symbol.iterator

///|
pub let iterator : Symbol = Symbol::iterator_ffi().cast()

///|
extern "js" fn Symbol::async_iterator_ffi() -> Value =
  #| () => Symbol.asyncIterator

///|
pub let async_iterator : Symbol = Symbol::async_iterator_ffi().cast()