1const isStickySupported = typeof /./g.sticky === 'boolean';
2
3export const _pattern = (input) => {
4 if (typeof input === 'function') return input;
5
6 const source = typeof input !== 'string' ? input.source : input;
7 return isStickySupported
8 ? new RegExp(source, 'y')
9 : new RegExp(`^(?:${source})`, 'g');
10};
11
12export const _exec = (state, pattern) => {
13 if (typeof pattern === 'function') return pattern();
14
15 let match;
16 if (isStickySupported) {
17 pattern.lastIndex = state.index;
18 match = pattern.exec(state.input);
19 state.index = pattern.lastIndex;
20 } else {
21 pattern.lastIndex = 0;
22 match = pattern.exec(state.input.slice(state.input));
23 state.index += pattern.lastIndex;
24 }
25
26 return match && match[0];
27};
28
29export const tag = (array, tag) => {
30 array.tag = tag;
31 return array;
32};
33
34export const parse = (pattern) => (input) => {
35 const state = { input, index: 0 };
36 return pattern(state);
37};
38
39export const match = (_name) => {
40 throw new TypeError(
41 'This match() function was not transformed. ' +
42 'Ensure that the Babel plugin is set up correctly and try again.'
43 );
44};