"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.findMatchingBracketPosition = findMatchingBracketPosition;
const LEFT_BRACKETS = ['(', '{'];
const RIGHT_BRACKETS = [')', '}'];

function findMatchingBracketPosition(contents, bracket, offset = 0) {
  // search first occurrence of `bracket`
  const firstBracketPos = contents.indexOf(bracket, offset);

  if (firstBracketPos < 0) {
    return -1;
  }

  let stackCounter = 0;
  const matchingBracket = getMatchingBracket(bracket);

  if (isLeftBracket(bracket)) {
    const contentsLength = contents.length; // search forward

    for (let i = firstBracketPos + 1; i < contentsLength; ++i) {
      const c = contents[i];

      if (c === bracket) {
        stackCounter += 1;
      } else if (c === matchingBracket) {
        if (stackCounter === 0) {
          return i;
        }

        stackCounter -= 1;
      }
    }
  } else {
    // search backward
    for (let i = firstBracketPos - 1; i >= 0; --i) {
      const c = contents[i];

      if (c === bracket) {
        stackCounter += 1;
      } else if (c === matchingBracket) {
        if (stackCounter === 0) {
          return i;
        }

        stackCounter -= 1;
      }
    }
  }

  return -1;
}

function isLeftBracket(bracket) {
  const leftBracketList = LEFT_BRACKETS;
  return leftBracketList.includes(bracket);
}

function getMatchingBracket(bracket) {
  switch (bracket) {
    case '(':
      return ')';

    case ')':
      return '(';

    case '{':
      return '}';

    case '}':
      return '{';

    default:
      throw new Error(`Unsupported bracket - ${bracket}`);
  }
}
//# sourceMappingURL=matchBrackets.js.map