1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4  value: true
5});
6exports.findMatchingBracketPosition = findMatchingBracketPosition;
7const LEFT_BRACKETS = ['(', '{'];
8const RIGHT_BRACKETS = [')', '}'];
9
10function findMatchingBracketPosition(contents, bracket, offset = 0) {
11  // search first occurrence of `bracket`
12  const firstBracketPos = contents.indexOf(bracket, offset);
13
14  if (firstBracketPos < 0) {
15    return -1;
16  }
17
18  let stackCounter = 0;
19  const matchingBracket = getMatchingBracket(bracket);
20
21  if (isLeftBracket(bracket)) {
22    const contentsLength = contents.length; // search forward
23
24    for (let i = firstBracketPos + 1; i < contentsLength; ++i) {
25      const c = contents[i];
26
27      if (c === bracket) {
28        stackCounter += 1;
29      } else if (c === matchingBracket) {
30        if (stackCounter === 0) {
31          return i;
32        }
33
34        stackCounter -= 1;
35      }
36    }
37  } else {
38    // search backward
39    for (let i = firstBracketPos - 1; i >= 0; --i) {
40      const c = contents[i];
41
42      if (c === bracket) {
43        stackCounter += 1;
44      } else if (c === matchingBracket) {
45        if (stackCounter === 0) {
46          return i;
47        }
48
49        stackCounter -= 1;
50      }
51    }
52  }
53
54  return -1;
55}
56
57function isLeftBracket(bracket) {
58  const leftBracketList = LEFT_BRACKETS;
59  return leftBracketList.includes(bracket);
60}
61
62function getMatchingBracket(bracket) {
63  switch (bracket) {
64    case '(':
65      return ')';
66
67    case ')':
68      return '(';
69
70    case '{':
71      return '}';
72
73    case '}':
74      return '{';
75
76    default:
77      throw new Error(`Unsupported bracket - ${bracket}`);
78  }
79}
80//# sourceMappingURL=matchBrackets.js.map