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