///|
// Enable upstream definitions only after their dependencies and behavior have
// been validated. Native fields override the source layer in Vm::base_env.
fn source_standard_function(name : String) -> Bool {
  match name {
    "map"
    | "mapWithIndex"
    | "assertEqual"
    | "objectFields"
    | "objectFieldsAll"
    | "objectHas"
    | "objectHasAll"
    | "manifestJson"
    | "split"
    | "format"
    | "isString"
    | "isNumber"
    | "isBoolean"
    | "isObject"
    | "isArray"
    | "isFunction"
    | "slice" => true
    _ => false
  }
}

///|
fn standard_library_expression() -> Expr raise {
  let source = parse(standard_library_source(), "", 512)
  guard source.kind is Obj(fields, locals, assertions, assertion_sites) else {
    raise problem(Runtime, source.loc, "standard library must be an object")
  }
  let enabled = fields.filter(fn(field) {
    match field.key.kind {
      Literal(String(name)) =>
        source_standard_function(name) ||
        (match name {
          "uniq"
          | "set"
          | "setUnion"
          | "setInter"
          | "setDiff"
          | "setMember"
          | "mergePatch"
          | "get"
          | "objectValues"
          | "objectValuesAll"
          | "objectKeysValues"
          | "objectKeysValuesAll"
          | "mapWithKey"
          | "prune"
          | "all"
          | "any"
          | "flattenArrays"
          | "flattenDeepArray"
          | "filterMap"
          | "count"
          | "repeat"
          | "find"
          | "deepJoin"
          | "min"
          | "max"
          | "clamp"
          | "__compare"
          | "__compare_array"
          | "__array_less"
          | "__array_greater"
          | "__array_less_or_equal"
          | "__array_greater_or_equal"
          | "pi"
          | "deg2rad"
          | "rad2deg"
          | "log2"
          | "log10"
          | "sign"
          | "mod" => true
          "asciiLower"
          | "asciiUpper"
          | "stringChars"
          | "parseHex"
          | "parseOctal"
          | "escapeStringJson"
          | "escapeStringPython"
          | "escapeStringBash"
          | "escapeStringDollars"
          | "escapeStringXML"
          | "findSubstr"
          | "resolvePath" => true
          "manifestJsonMinified"
          | "manifestToml"
          | "manifestYamlStream"
          | "manifestPython"
          | "manifestPythonVars"
          | "manifestIni"
          | "manifestXmlJsonml" => true
          _ => false
        })
      _ => false
    }
  })
  {
    kind: Obj(enabled, locals, assertions, assertion_sites),
    loc: source.loc,
    end: source.end,
  }
}