/**
 * This file is part of the Fun programming language.
 * https://fun-lang.xyz/
 *
 * Copyright 2025 Johannes Findeisen <you@hanez.org>
 * Licensed under the terms of the Apache-2.0 license.
 * https://opensource.org/license/apache-2-0
 */

#include "value.h"

/* array utilities */

int array_contains(const Value *v, const Value *needle) {
  if (!v || v->type != VAL_ARRAY || !v->arr) return 0;
  int n = array_length(v);
  for (int i = 0; i < n; ++i) {
    Value item;
    if (array_get_copy(v, i, &item)) {
      int eq = value_equals(&item, needle);
      free_value(item);
      if (eq) return 1;
    }
  }
  return 0;
}

int array_index_of(const Value *v, const Value *needle) {
  if (!v || v->type != VAL_ARRAY || !v->arr) return -1;
  int n = array_length(v);
  for (int i = 0; i < n; ++i) {
    Value item;
    if (array_get_copy(v, i, &item)) {
      int eq = value_equals(&item, needle);
      free_value(item);
      if (eq) return i;
    }
  }
  return -1;
}

void array_clear(Value *v) {
  if (!v || v->type != VAL_ARRAY || !v->arr) return;
  int n = array_length(v);
  for (int i = 0; i < n; ++i) {
    Value item;
    if (array_get_copy(v, i, &item)) {
      free_value(item);
    }
  }
  /* internal clear uses public API to reset to zero length */
  /* Since we don't expose capacity, emulate by popping elements */
  Value out;
  while (array_pop(v, &out)) {
    free_value(out);
  }
}
