57 lines
1.4 KiB
C
57 lines
1.4 KiB
C
/**
|
|
* 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);
|
|
}
|
|
}
|