import {
  Alternative,
  Assertion,
  Atom,
  Disjunction,
  RegExpParser,
  RegExpPattern
} from "regexp-to-ast"

let regExpAstCache: { [regex: string]: RegExpPattern } = {}
const regExpParser = new RegExpParser()

// this should be moved to regexp-to-ast
export type ASTNode =
  | RegExpPattern
  | Disjunction
  | Alternative
  | Assertion
  | Atom

export function getRegExpAst(regExp: RegExp): RegExpPattern {
  const regExpStr = regExp.toString()
  if (regExpAstCache.hasOwnProperty(regExpStr)) {
    return regExpAstCache[regExpStr]
  } else {
    const regExpAst = regExpParser.pattern(regExpStr)
    regExpAstCache[regExpStr] = regExpAst
    return regExpAst
  }
}

export function clearRegExpParserCache() {
  regExpAstCache = {}
}
