import { dew as _utilsDewDew } from "./utils.dew.js";
var exports = {},
    _dewExec = false;
export function dew() {
  if (_dewExec) return exports;
  _dewExec = true;

  var utils = _utilsDewDew();
  /**
   * The following functions come from pako, from pako/lib/zlib/crc32.js
   * released under the MIT license, see pako https://github.com/nodeca/pako/
   */
  // Use ordinary array, since untyped makes no boost here


  function makeTable() {
    var c,
        table = [];

    for (var n = 0; n < 256; n++) {
      c = n;

      for (var k = 0; k < 8; k++) {
        c = c & 1 ? 0xEDB88320 ^ c >>> 1 : c >>> 1;
      }

      table[n] = c;
    }

    return table;
  } // Create table on load. Just 255 signed longs. Not a problem.


  var crcTable = makeTable();

  function crc32(crc, buf, len, pos) {
    var t = crcTable,
        end = pos + len;
    crc = crc ^ -1;

    for (var i = pos; i < end; i++) {
      crc = crc >>> 8 ^ t[(crc ^ buf[i]) & 0xFF];
    }

    return crc ^ -1; // >>> 0;
  } // That's all for the pako functions.

  /**
   * Compute the crc32 of a string.
   * This is almost the same as the function crc32, but for strings. Using the
   * same function for the two use cases leads to horrible performances.
   * @param {Number} crc the starting value of the crc.
   * @param {String} str the string to use.
   * @param {Number} len the length of the string.
   * @param {Number} pos the starting position for the crc32 computation.
   * @return {Number} the computed crc32.
   */


  function crc32str(crc, str, len, pos) {
    var t = crcTable,
        end = pos + len;
    crc = crc ^ -1;

    for (var i = pos; i < end; i++) {
      crc = crc >>> 8 ^ t[(crc ^ str.charCodeAt(i)) & 0xFF];
    }

    return crc ^ -1; // >>> 0;
  }

  exports = function crc32wrapper(input, crc) {
    if (typeof input === "undefined" || !input.length) {
      return 0;
    }

    var isArray = utils.getTypeOf(input) !== "string";

    if (isArray) {
      return crc32(crc | 0, input, input.length, 0);
    } else {
      return crc32str(crc | 0, input, input.length, 0);
    }
  };

  return exports;
}