const fnCache: { [key: string]: any } = {}
function scriptValue(input: string, args: { [key: string]: any }): Function {
  let params: string[] = []
  let vals: any[] = []
  for (let k in args) {
    params.push(k)
    vals.push(args[k])
  }
  let keys = params.join(',')
  let fnKey = keys + input
  if (!fnCache[fnKey]) {
    fnCache[fnKey] = Function(
      '"use strict";return (function(' + keys + '){ return ' + input + '})',
    )()
  }
  try {
    return fnCache[fnKey](...vals)
  } catch (e) {
    console.error(
      `scriptValue error: '${e}' in expression: '${input}' with ctx: '${JSON.stringify(
        args,
      )}'`,
    )
  }
}