"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isFloat16Array = isFloat16Array;

var _arrayIterator = require("./_util/arrayIterator.cjs");

var _brand = require("./_util/brand.cjs");

var _converter = require("./_util/converter.cjs");

var _is = require("./_util/is.cjs");

var _messages = require("./_util/messages.cjs");

var _primordials = require("./_util/primordials.cjs");

var _spec = require("./_util/spec.cjs");

const BYTES_PER_ELEMENT = 2;
const float16bitsArrays = new _primordials.NativeWeakMap();

function isFloat16Array(target) {
  return (0, _primordials.WeakMapPrototypeHas)(float16bitsArrays, target) || !(0, _primordials.ArrayBufferIsView)(target) && (0, _brand.hasFloat16ArrayBrand)(target);
}

function assertFloat16Array(target) {
  if (!isFloat16Array(target)) {
    throw (0, _primordials.NativeTypeError)(_messages.THIS_IS_NOT_A_FLOAT16ARRAY_OBJECT);
  }
}

function assertSpeciesTypedArray(target, count) {
  const isTargetFloat16Array = isFloat16Array(target);
  const isTargetTypedArray = (0, _is.isNativeTypedArray)(target);

  if (!isTargetFloat16Array && !isTargetTypedArray) {
    throw (0, _primordials.NativeTypeError)(_messages.SPECIES_CONSTRUCTOR_DIDNT_RETURN_TYPEDARRAY_OBJECT);
  }

  if (typeof count === "number") {
    let length;

    if (isTargetFloat16Array) {
      const float16bitsArray = getFloat16BitsArray(target);
      length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    } else {
      length = (0, _primordials.TypedArrayPrototypeGetLength)(target);
    }

    if (length < count) {
      throw (0, _primordials.NativeTypeError)(_messages.DERIVED_CONSTRUCTOR_CREATED_TYPEDARRAY_OBJECT_WHICH_WAS_TOO_SMALL_LENGTH);
    }
  }

  if ((0, _is.isNativeBigIntTypedArray)(target)) {
    throw (0, _primordials.NativeTypeError)(_messages.CANNOT_MIX_BIGINT_AND_OTHER_TYPES);
  }
}

function getFloat16BitsArray(float16) {
  const float16bitsArray = (0, _primordials.WeakMapPrototypeGet)(float16bitsArrays, float16);

  if (float16bitsArray !== undefined) {
    const buffer = (0, _primordials.TypedArrayPrototypeGetBuffer)(float16bitsArray);

    if ((0, _spec.IsDetachedBuffer)(buffer)) {
      throw (0, _primordials.NativeTypeError)(_messages.ATTEMPTING_TO_ACCESS_DETACHED_ARRAYBUFFER);
    }

    return float16bitsArray;
  }

  const buffer = float16.buffer;

  if ((0, _spec.IsDetachedBuffer)(buffer)) {
    throw (0, _primordials.NativeTypeError)(_messages.ATTEMPTING_TO_ACCESS_DETACHED_ARRAYBUFFER);
  }

  const cloned = (0, _primordials.ReflectConstruct)(Float16Array, [buffer, float16.byteOffset, float16.length], float16.constructor);
  return (0, _primordials.WeakMapPrototypeGet)(float16bitsArrays, cloned);
}

function copyToArray(float16bitsArray) {
  const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
  const array = [];

  for (let i = 0; i < length; ++i) {
    array[i] = (0, _converter.convertToNumber)(float16bitsArray[i]);
  }

  return array;
}

const TypedArrayPrototypeGetters = new _primordials.NativeWeakSet();

for (const key of (0, _primordials.ReflectOwnKeys)(_primordials.TypedArrayPrototype)) {
  if (key === _primordials.SymbolToStringTag) {
    continue;
  }

  const descriptor = (0, _primordials.ReflectGetOwnPropertyDescriptor)(_primordials.TypedArrayPrototype, key);

  if ((0, _primordials.ObjectHasOwn)(descriptor, "get") && typeof descriptor.get === "function") {
    (0, _primordials.WeakSetPrototypeAdd)(TypedArrayPrototypeGetters, descriptor.get);
  }
}

const handler = (0, _primordials.ObjectFreeze)({
  get(target, key, receiver) {
    if ((0, _is.isCanonicalIntegerIndexString)(key) && (0, _primordials.ObjectHasOwn)(target, key)) {
      return (0, _converter.convertToNumber)((0, _primordials.ReflectGet)(target, key));
    }

    if ((0, _primordials.WeakSetPrototypeHas)(TypedArrayPrototypeGetters, (0, _primordials.ObjectPrototype__lookupGetter__)(target, key))) {
      return (0, _primordials.ReflectGet)(target, key);
    }

    return (0, _primordials.ReflectGet)(target, key, receiver);
  },

  set(target, key, value, receiver) {
    if ((0, _is.isCanonicalIntegerIndexString)(key) && (0, _primordials.ObjectHasOwn)(target, key)) {
      return (0, _primordials.ReflectSet)(target, key, (0, _converter.roundToFloat16Bits)(value));
    }

    return (0, _primordials.ReflectSet)(target, key, value, receiver);
  },

  getOwnPropertyDescriptor(target, key) {
    if ((0, _is.isCanonicalIntegerIndexString)(key) && (0, _primordials.ObjectHasOwn)(target, key)) {
      const descriptor = (0, _primordials.ReflectGetOwnPropertyDescriptor)(target, key);
      descriptor.value = (0, _converter.convertToNumber)(descriptor.value);
      return descriptor;
    }

    return (0, _primordials.ReflectGetOwnPropertyDescriptor)(target, key);
  },

  defineProperty(target, key, descriptor) {
    if ((0, _is.isCanonicalIntegerIndexString)(key) && (0, _primordials.ObjectHasOwn)(target, key) && (0, _primordials.ObjectHasOwn)(descriptor, "value")) {
      descriptor.value = (0, _converter.roundToFloat16Bits)(descriptor.value);
      return (0, _primordials.ReflectDefineProperty)(target, key, descriptor);
    }

    return (0, _primordials.ReflectDefineProperty)(target, key, descriptor);
  }

});

class Float16Array {
  constructor(input, _byteOffset, _length) {
    let float16bitsArray;

    if (isFloat16Array(input)) {
      float16bitsArray = (0, _primordials.ReflectConstruct)(_primordials.NativeUint16Array, [getFloat16BitsArray(input)], new.target);
    } else if ((0, _is.isObject)(input) && !(0, _is.isArrayBuffer)(input)) {
      let list;
      let length;

      if ((0, _is.isNativeTypedArray)(input)) {
        list = input;
        length = (0, _primordials.TypedArrayPrototypeGetLength)(input);
        const buffer = (0, _primordials.TypedArrayPrototypeGetBuffer)(input);
        const BufferConstructor = !(0, _is.isSharedArrayBuffer)(buffer) ? (0, _spec.SpeciesConstructor)(buffer, _primordials.NativeArrayBuffer) : _primordials.NativeArrayBuffer;

        if ((0, _spec.IsDetachedBuffer)(buffer)) {
          throw (0, _primordials.NativeTypeError)(_messages.ATTEMPTING_TO_ACCESS_DETACHED_ARRAYBUFFER);
        }

        if ((0, _is.isNativeBigIntTypedArray)(input)) {
          throw (0, _primordials.NativeTypeError)(_messages.CANNOT_MIX_BIGINT_AND_OTHER_TYPES);
        }

        const data = new BufferConstructor(length * BYTES_PER_ELEMENT);
        float16bitsArray = (0, _primordials.ReflectConstruct)(_primordials.NativeUint16Array, [data], new.target);
      } else {
        const iterator = input[_primordials.SymbolIterator];

        if (iterator != null && typeof iterator !== "function") {
          throw (0, _primordials.NativeTypeError)(_messages.ITERATOR_PROPERTY_IS_NOT_CALLABLE);
        }

        if (iterator != null) {
          if ((0, _is.isOrdinaryArray)(input)) {
            list = input;
            length = input.length;
          } else {
            list = [...input];
            length = list.length;
          }
        } else {
          list = input;
          length = (0, _spec.ToLength)(list.length);
        }

        float16bitsArray = (0, _primordials.ReflectConstruct)(_primordials.NativeUint16Array, [length], new.target);
      }

      for (let i = 0; i < length; ++i) {
        float16bitsArray[i] = (0, _converter.roundToFloat16Bits)(list[i]);
      }
    } else {
      float16bitsArray = (0, _primordials.ReflectConstruct)(_primordials.NativeUint16Array, arguments, new.target);
    }

    const proxy = new _primordials.NativeProxy(float16bitsArray, handler);
    (0, _primordials.WeakMapPrototypeSet)(float16bitsArrays, proxy, float16bitsArray);
    return proxy;
  }

  static from(src, ...opts) {
    const Constructor = this;

    if (!(0, _primordials.ReflectHas)(Constructor, _brand.brand)) {
      throw (0, _primordials.NativeTypeError)(_messages.THIS_CONSTRUCTOR_IS_NOT_A_SUBCLASS_OF_FLOAT16ARRAY);
    }

    if (Constructor === Float16Array) {
      if (isFloat16Array(src) && opts.length === 0) {
        const float16bitsArray = getFloat16BitsArray(src);
        const uint16 = new _primordials.NativeUint16Array((0, _primordials.TypedArrayPrototypeGetBuffer)(float16bitsArray), (0, _primordials.TypedArrayPrototypeGetByteOffset)(float16bitsArray), (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray));
        return new Float16Array((0, _primordials.TypedArrayPrototypeGetBuffer)((0, _primordials.TypedArrayPrototypeSlice)(uint16)));
      }

      if (opts.length === 0) {
        return new Float16Array((0, _primordials.TypedArrayPrototypeGetBuffer)((0, _primordials.Uint16ArrayFrom)(src, _converter.roundToFloat16Bits)));
      }

      const mapFunc = opts[0];
      const thisArg = opts[1];
      return new Float16Array((0, _primordials.TypedArrayPrototypeGetBuffer)((0, _primordials.Uint16ArrayFrom)(src, function (val, ...args) {
        return (0, _converter.roundToFloat16Bits)((0, _primordials.ReflectApply)(mapFunc, this, [val, ...(0, _arrayIterator.safeIfNeeded)(args)]));
      }, thisArg)));
    }

    let list;
    let length;
    const iterator = src[_primordials.SymbolIterator];

    if (iterator != null && typeof iterator !== "function") {
      throw (0, _primordials.NativeTypeError)(_messages.ITERATOR_PROPERTY_IS_NOT_CALLABLE);
    }

    if (iterator != null) {
      if ((0, _is.isOrdinaryArray)(src)) {
        list = src;
        length = src.length;
      } else if ((0, _is.isOrdinaryNativeTypedArray)(src)) {
        list = src;
        length = (0, _primordials.TypedArrayPrototypeGetLength)(src);
      } else {
        list = [...src];
        length = list.length;
      }
    } else {
      if (src == null) {
        throw (0, _primordials.NativeTypeError)(_messages.CANNOT_CONVERT_UNDEFINED_OR_NULL_TO_OBJECT);
      }

      list = (0, _primordials.NativeObject)(src);
      length = (0, _spec.ToLength)(list.length);
    }

    const array = new Constructor(length);

    if (opts.length === 0) {
      for (let i = 0; i < length; ++i) {
        array[i] = list[i];
      }
    } else {
      const mapFunc = opts[0];
      const thisArg = opts[1];

      for (let i = 0; i < length; ++i) {
        array[i] = (0, _primordials.ReflectApply)(mapFunc, thisArg, [list[i], i]);
      }
    }

    return array;
  }

  static of(...items) {
    const Constructor = this;

    if (!(0, _primordials.ReflectHas)(Constructor, _brand.brand)) {
      throw (0, _primordials.NativeTypeError)(_messages.THIS_CONSTRUCTOR_IS_NOT_A_SUBCLASS_OF_FLOAT16ARRAY);
    }

    const length = items.length;

    if (Constructor === Float16Array) {
      const proxy = new Float16Array(length);
      const float16bitsArray = getFloat16BitsArray(proxy);

      for (let i = 0; i < length; ++i) {
        float16bitsArray[i] = (0, _converter.roundToFloat16Bits)(items[i]);
      }

      return proxy;
    }

    const array = new Constructor(length);

    for (let i = 0; i < length; ++i) {
      array[i] = items[i];
    }

    return array;
  }

  keys() {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    return (0, _primordials.TypedArrayPrototypeKeys)(float16bitsArray);
  }

  values() {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    return (0, _arrayIterator.wrap)(function* () {
      for (const val of (0, _primordials.TypedArrayPrototypeValues)(float16bitsArray)) {
        yield (0, _converter.convertToNumber)(val);
      }
    }());
  }

  entries() {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    return (0, _arrayIterator.wrap)(function* () {
      for (const [i, val] of (0, _primordials.TypedArrayPrototypeEntries)(float16bitsArray)) {
        yield [i, (0, _converter.convertToNumber)(val)];
      }
    }());
  }

  at(index) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    const relativeIndex = (0, _spec.ToIntegerOrInfinity)(index);
    const k = relativeIndex >= 0 ? relativeIndex : length + relativeIndex;

    if (k < 0 || k >= length) {
      return;
    }

    return (0, _converter.convertToNumber)(float16bitsArray[k]);
  }

  map(callback, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    const thisArg = opts[0];
    const Constructor = (0, _spec.SpeciesConstructor)(float16bitsArray, Float16Array);

    if (Constructor === Float16Array) {
      const proxy = new Float16Array(length);
      const array = getFloat16BitsArray(proxy);

      for (let i = 0; i < length; ++i) {
        const val = (0, _converter.convertToNumber)(float16bitsArray[i]);
        array[i] = (0, _converter.roundToFloat16Bits)((0, _primordials.ReflectApply)(callback, thisArg, [val, i, this]));
      }

      return proxy;
    }

    const array = new Constructor(length);
    assertSpeciesTypedArray(array, length);

    for (let i = 0; i < length; ++i) {
      const val = (0, _converter.convertToNumber)(float16bitsArray[i]);
      array[i] = (0, _primordials.ReflectApply)(callback, thisArg, [val, i, this]);
    }

    return array;
  }

  filter(callback, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    const thisArg = opts[0];
    const kept = [];

    for (let i = 0; i < length; ++i) {
      const val = (0, _converter.convertToNumber)(float16bitsArray[i]);

      if ((0, _primordials.ReflectApply)(callback, thisArg, [val, i, this])) {
        (0, _primordials.ArrayPrototypePush)(kept, val);
      }
    }

    const Constructor = (0, _spec.SpeciesConstructor)(float16bitsArray, Float16Array);
    const array = new Constructor(kept);
    assertSpeciesTypedArray(array);
    return array;
  }

  reduce(callback, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);

    if (length === 0 && opts.length === 0) {
      throw (0, _primordials.NativeTypeError)(_messages.REDUCE_OF_EMPTY_ARRAY_WITH_NO_INITIAL_VALUE);
    }

    let accumulator, start;

    if (opts.length === 0) {
      accumulator = (0, _converter.convertToNumber)(float16bitsArray[0]);
      start = 1;
    } else {
      accumulator = opts[0];
      start = 0;
    }

    for (let i = start; i < length; ++i) {
      accumulator = callback(accumulator, (0, _converter.convertToNumber)(float16bitsArray[i]), i, this);
    }

    return accumulator;
  }

  reduceRight(callback, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);

    if (length === 0 && opts.length === 0) {
      throw (0, _primordials.NativeTypeError)(_messages.REDUCE_OF_EMPTY_ARRAY_WITH_NO_INITIAL_VALUE);
    }

    let accumulator, start;

    if (opts.length === 0) {
      accumulator = (0, _converter.convertToNumber)(float16bitsArray[length - 1]);
      start = length - 2;
    } else {
      accumulator = opts[0];
      start = length - 1;
    }

    for (let i = start; i >= 0; --i) {
      accumulator = callback(accumulator, (0, _converter.convertToNumber)(float16bitsArray[i]), i, this);
    }

    return accumulator;
  }

  forEach(callback, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    const thisArg = opts[0];

    for (let i = 0; i < length; ++i) {
      (0, _primordials.ReflectApply)(callback, thisArg, [(0, _converter.convertToNumber)(float16bitsArray[i]), i, this]);
    }
  }

  find(callback, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    const thisArg = opts[0];

    for (let i = 0; i < length; ++i) {
      const value = (0, _converter.convertToNumber)(float16bitsArray[i]);

      if ((0, _primordials.ReflectApply)(callback, thisArg, [value, i, this])) {
        return value;
      }
    }
  }

  findIndex(callback, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    const thisArg = opts[0];

    for (let i = 0; i < length; ++i) {
      const value = (0, _converter.convertToNumber)(float16bitsArray[i]);

      if ((0, _primordials.ReflectApply)(callback, thisArg, [value, i, this])) {
        return i;
      }
    }

    return -1;
  }

  findLast(callback, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    const thisArg = opts[0];

    for (let i = length - 1; i >= 0; --i) {
      const value = (0, _converter.convertToNumber)(float16bitsArray[i]);

      if ((0, _primordials.ReflectApply)(callback, thisArg, [value, i, this])) {
        return value;
      }
    }
  }

  findLastIndex(callback, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    const thisArg = opts[0];

    for (let i = length - 1; i >= 0; --i) {
      const value = (0, _converter.convertToNumber)(float16bitsArray[i]);

      if ((0, _primordials.ReflectApply)(callback, thisArg, [value, i, this])) {
        return i;
      }
    }

    return -1;
  }

  every(callback, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    const thisArg = opts[0];

    for (let i = 0; i < length; ++i) {
      if (!(0, _primordials.ReflectApply)(callback, thisArg, [(0, _converter.convertToNumber)(float16bitsArray[i]), i, this])) {
        return false;
      }
    }

    return true;
  }

  some(callback, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    const thisArg = opts[0];

    for (let i = 0; i < length; ++i) {
      if ((0, _primordials.ReflectApply)(callback, thisArg, [(0, _converter.convertToNumber)(float16bitsArray[i]), i, this])) {
        return true;
      }
    }

    return false;
  }

  set(input, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const targetOffset = (0, _spec.ToIntegerOrInfinity)(opts[0]);

    if (targetOffset < 0) {
      throw (0, _primordials.NativeRangeError)(_messages.OFFSET_IS_OUT_OF_BOUNDS);
    }

    if (input == null) {
      throw (0, _primordials.NativeTypeError)(_messages.CANNOT_CONVERT_UNDEFINED_OR_NULL_TO_OBJECT);
    }

    if ((0, _is.isNativeBigIntTypedArray)(input)) {
      throw (0, _primordials.NativeTypeError)(_messages.CANNOT_MIX_BIGINT_AND_OTHER_TYPES);
    }

    if (isFloat16Array(input)) {
      return (0, _primordials.TypedArrayPrototypeSet)(getFloat16BitsArray(this), getFloat16BitsArray(input), targetOffset);
    }

    if ((0, _is.isNativeTypedArray)(input)) {
      const buffer = (0, _primordials.TypedArrayPrototypeGetBuffer)(input);

      if ((0, _spec.IsDetachedBuffer)(buffer)) {
        throw (0, _primordials.NativeTypeError)(_messages.ATTEMPTING_TO_ACCESS_DETACHED_ARRAYBUFFER);
      }
    }

    const targetLength = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    const src = (0, _primordials.NativeObject)(input);
    const srcLength = (0, _spec.ToLength)(src.length);

    if (targetOffset === Infinity || srcLength + targetOffset > targetLength) {
      throw (0, _primordials.NativeRangeError)(_messages.OFFSET_IS_OUT_OF_BOUNDS);
    }

    for (let i = 0; i < srcLength; ++i) {
      float16bitsArray[i + targetOffset] = (0, _converter.roundToFloat16Bits)(src[i]);
    }
  }

  reverse() {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    (0, _primordials.TypedArrayPrototypeReverse)(float16bitsArray);
    return this;
  }

  fill(value, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    (0, _primordials.TypedArrayPrototypeFill)(float16bitsArray, (0, _converter.roundToFloat16Bits)(value), ...(0, _arrayIterator.safeIfNeeded)(opts));
    return this;
  }

  copyWithin(target, start, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    (0, _primordials.TypedArrayPrototypeCopyWithin)(float16bitsArray, target, start, ...(0, _arrayIterator.safeIfNeeded)(opts));
    return this;
  }

  sort(...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const compare = opts[0] !== undefined ? opts[0] : _spec.defaultCompare;
    (0, _primordials.TypedArrayPrototypeSort)(float16bitsArray, (x, y) => {
      return compare((0, _converter.convertToNumber)(x), (0, _converter.convertToNumber)(y));
    });
    return this;
  }

  slice(...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const Constructor = (0, _spec.SpeciesConstructor)(float16bitsArray, Float16Array);

    if (Constructor === Float16Array) {
      const uint16 = new _primordials.NativeUint16Array((0, _primordials.TypedArrayPrototypeGetBuffer)(float16bitsArray), (0, _primordials.TypedArrayPrototypeGetByteOffset)(float16bitsArray), (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray));
      return new Float16Array((0, _primordials.TypedArrayPrototypeGetBuffer)((0, _primordials.TypedArrayPrototypeSlice)(uint16, ...(0, _arrayIterator.safeIfNeeded)(opts))));
    }

    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    const start = (0, _spec.ToIntegerOrInfinity)(opts[0]);
    const end = opts[1] === undefined ? length : (0, _spec.ToIntegerOrInfinity)(opts[1]);
    let k;

    if (start === -Infinity) {
      k = 0;
    } else if (start < 0) {
      k = length + start > 0 ? length + start : 0;
    } else {
      k = length < start ? length : start;
    }

    let final;

    if (end === -Infinity) {
      final = 0;
    } else if (end < 0) {
      final = length + end > 0 ? length + end : 0;
    } else {
      final = length < end ? length : end;
    }

    const count = final - k > 0 ? final - k : 0;
    const array = new Constructor(count);
    assertSpeciesTypedArray(array, count);

    if (count === 0) {
      return array;
    }

    const buffer = (0, _primordials.TypedArrayPrototypeGetBuffer)(float16bitsArray);

    if ((0, _spec.IsDetachedBuffer)(buffer)) {
      throw (0, _primordials.NativeTypeError)(_messages.ATTEMPTING_TO_ACCESS_DETACHED_ARRAYBUFFER);
    }

    let n = 0;

    while (k < final) {
      array[n] = (0, _converter.convertToNumber)(float16bitsArray[k]);
      ++k;
      ++n;
    }

    return array;
  }

  subarray(...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const Constructor = (0, _spec.SpeciesConstructor)(float16bitsArray, Float16Array);
    const uint16 = new _primordials.NativeUint16Array((0, _primordials.TypedArrayPrototypeGetBuffer)(float16bitsArray), (0, _primordials.TypedArrayPrototypeGetByteOffset)(float16bitsArray), (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray));
    const uint16Subarray = (0, _primordials.TypedArrayPrototypeSubarray)(uint16, ...(0, _arrayIterator.safeIfNeeded)(opts));
    const array = new Constructor((0, _primordials.TypedArrayPrototypeGetBuffer)(uint16Subarray), (0, _primordials.TypedArrayPrototypeGetByteOffset)(uint16Subarray), (0, _primordials.TypedArrayPrototypeGetLength)(uint16Subarray));
    assertSpeciesTypedArray(array);
    return array;
  }

  indexOf(element, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    let from = (0, _spec.ToIntegerOrInfinity)(opts[0]);

    if (from === Infinity) {
      return -1;
    }

    if (from < 0) {
      from += length;

      if (from < 0) {
        from = 0;
      }
    }

    for (let i = from; i < length; ++i) {
      if ((0, _primordials.ObjectHasOwn)(float16bitsArray, i) && (0, _converter.convertToNumber)(float16bitsArray[i]) === element) {
        return i;
      }
    }

    return -1;
  }

  lastIndexOf(element, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    let from = opts.length >= 1 ? (0, _spec.ToIntegerOrInfinity)(opts[0]) : length - 1;

    if (from === -Infinity) {
      return -1;
    }

    if (from >= 0) {
      from = from < length - 1 ? from : length - 1;
    } else {
      from += length;
    }

    for (let i = from; i >= 0; --i) {
      if ((0, _primordials.ObjectHasOwn)(float16bitsArray, i) && (0, _converter.convertToNumber)(float16bitsArray[i]) === element) {
        return i;
      }
    }

    return -1;
  }

  includes(element, ...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const length = (0, _primordials.TypedArrayPrototypeGetLength)(float16bitsArray);
    let from = (0, _spec.ToIntegerOrInfinity)(opts[0]);

    if (from === Infinity) {
      return false;
    }

    if (from < 0) {
      from += length;

      if (from < 0) {
        from = 0;
      }
    }

    const isNaN = (0, _primordials.NumberIsNaN)(element);

    for (let i = from; i < length; ++i) {
      const value = (0, _converter.convertToNumber)(float16bitsArray[i]);

      if (isNaN && (0, _primordials.NumberIsNaN)(value)) {
        return true;
      }

      if (value === element) {
        return true;
      }
    }

    return false;
  }

  join(...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const array = copyToArray(float16bitsArray);
    return (0, _primordials.ArrayPrototypeJoin)(array, ...(0, _arrayIterator.safeIfNeeded)(opts));
  }

  toLocaleString(...opts) {
    assertFloat16Array(this);
    const float16bitsArray = getFloat16BitsArray(this);
    const array = copyToArray(float16bitsArray);
    return (0, _primordials.ArrayPrototypeToLocaleString)(array, ...(0, _arrayIterator.safeIfNeeded)(opts));
  }

  get [_primordials.SymbolToStringTag]() {
    if (isFloat16Array(this)) {
      return "Float16Array";
    }
  }

}

exports.Float16Array = Float16Array;
(0, _primordials.ObjectDefineProperty)(Float16Array, "BYTES_PER_ELEMENT", {
  value: BYTES_PER_ELEMENT
});
(0, _primordials.ObjectDefineProperty)(Float16Array, _brand.brand, {});
(0, _primordials.ReflectSetPrototypeOf)(Float16Array, _primordials.TypedArray);
const Float16ArrayPrototype = Float16Array.prototype;
(0, _primordials.ObjectDefineProperty)(Float16ArrayPrototype, "BYTES_PER_ELEMENT", {
  value: BYTES_PER_ELEMENT
});
(0, _primordials.ObjectDefineProperty)(Float16ArrayPrototype, _primordials.SymbolIterator, {
  value: Float16ArrayPrototype.values,
  writable: true,
  configurable: true
});
(0, _primordials.ReflectSetPrototypeOf)(Float16ArrayPrototype, _primordials.TypedArrayPrototype);