1082815dcSEvan Bacon"use strict";
2082815dcSEvan Bacon
3082815dcSEvan BaconObject.defineProperty(exports, "__esModule", {
4082815dcSEvan Bacon  value: true
5082815dcSEvan Bacon});
6082815dcSEvan Baconexports.findMatchingBracketPosition = findMatchingBracketPosition;
7082815dcSEvan Baconconst LEFT_BRACKETS = ['(', '{'];
8082815dcSEvan Baconconst RIGHT_BRACKETS = [')', '}'];
9082815dcSEvan Baconfunction findMatchingBracketPosition(contents, bracket, offset = 0) {
10082815dcSEvan Bacon  // search first occurrence of `bracket`
11082815dcSEvan Bacon  const firstBracketPos = contents.indexOf(bracket, offset);
12082815dcSEvan Bacon  if (firstBracketPos < 0) {
13082815dcSEvan Bacon    return -1;
14082815dcSEvan Bacon  }
15082815dcSEvan Bacon  let stackCounter = 0;
16082815dcSEvan Bacon  const matchingBracket = getMatchingBracket(bracket);
17082815dcSEvan Bacon  if (isLeftBracket(bracket)) {
18*ee216927STomasz Sapeta    const contentsLength = contents.length;
19*ee216927STomasz Sapeta    // search forward
20082815dcSEvan Bacon    for (let i = firstBracketPos + 1; i < contentsLength; ++i) {
21082815dcSEvan Bacon      const c = contents[i];
22082815dcSEvan Bacon      if (c === bracket) {
23082815dcSEvan Bacon        stackCounter += 1;
24082815dcSEvan Bacon      } else if (c === matchingBracket) {
25082815dcSEvan Bacon        if (stackCounter === 0) {
26082815dcSEvan Bacon          return i;
27082815dcSEvan Bacon        }
28082815dcSEvan Bacon        stackCounter -= 1;
29082815dcSEvan Bacon      }
30082815dcSEvan Bacon    }
31082815dcSEvan Bacon  } else {
32082815dcSEvan Bacon    // search backward
33082815dcSEvan Bacon    for (let i = firstBracketPos - 1; i >= 0; --i) {
34082815dcSEvan Bacon      const c = contents[i];
35082815dcSEvan Bacon      if (c === bracket) {
36082815dcSEvan Bacon        stackCounter += 1;
37082815dcSEvan Bacon      } else if (c === matchingBracket) {
38082815dcSEvan Bacon        if (stackCounter === 0) {
39082815dcSEvan Bacon          return i;
40082815dcSEvan Bacon        }
41082815dcSEvan Bacon        stackCounter -= 1;
42082815dcSEvan Bacon      }
43082815dcSEvan Bacon    }
44082815dcSEvan Bacon  }
45082815dcSEvan Bacon  return -1;
46082815dcSEvan Bacon}
47082815dcSEvan Baconfunction isLeftBracket(bracket) {
48082815dcSEvan Bacon  const leftBracketList = LEFT_BRACKETS;
49082815dcSEvan Bacon  return leftBracketList.includes(bracket);
50082815dcSEvan Bacon}
51082815dcSEvan Baconfunction getMatchingBracket(bracket) {
52082815dcSEvan Bacon  switch (bracket) {
53082815dcSEvan Bacon    case '(':
54082815dcSEvan Bacon      return ')';
55082815dcSEvan Bacon    case ')':
56082815dcSEvan Bacon      return '(';
57082815dcSEvan Bacon    case '{':
58082815dcSEvan Bacon      return '}';
59082815dcSEvan Bacon    case '}':
60082815dcSEvan Bacon      return '{';
61082815dcSEvan Bacon    default:
62082815dcSEvan Bacon      throw new Error(`Unsupported bracket - ${bracket}`);
63082815dcSEvan Bacon  }
64082815dcSEvan Bacon}
65082815dcSEvan Bacon//# sourceMappingURL=matchBrackets.js.map