/*!
 * util/utf8.js - Implementation of UTF-8 Encoder/Decoder
 *
 * Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
 */
"use strict";

var lodash = require("lodash");

var partialRight = lodash.partialRight;
var merge = lodash.merge;

var typedArrayCtors = (function() {
  var ctors = [];
  if ("undefined" !== typeof Uint8ClampedArray) {
    ctors.push(Uint8ClampedArray);
  }
  if ("undefined" !== typeof Uint8Array) {
    ctors.push(Uint8Array);
  }
  if ("undefined" !== typeof Uint16Array) {
    ctors.push(Uint16Array);
  }
  if ("undefined" !== typeof Uint32Array) {
    ctors.push(Uint32Array);
  }
  if ("undefined" !== typeof Float32Array) {
    ctors.push(Float32Array);
  }
  if ("undefined" !== typeof Float64Array) {
    ctors.push(Float64Array);
  }
  return ctors;
})();

function findTypedArrayFor(ta) {
  var ctor;
  for (var idx = 0; !ctor && typedArrayCtors.length > idx; idx++) {
    if (ta instanceof typedArrayCtors[idx]) {
      ctor = typedArrayCtors[idx];
    }
  }
  return ctor;
}

function mergeBuffer(a, b) {
  // TODO: should this be a copy, or the reference itself?
  if (Buffer.isBuffer(b)) {
    b = Buffer.from(b);
  } else {
    var Ctor = findTypedArrayFor(b);
    b = Ctor ?
        new Ctor(b, b.byteOffset, b.byteLength) :
        undefined;
  }

  // TODO: QUESTION: create a merged <whatever-a-is>??
  // for now, a is b
  a = b;

  return b;
}

module.exports = partialRight(merge, mergeBuffer);
