aboutsummaryrefslogtreecommitdiff
path: root/builtins
diff options
context:
space:
mode:
Diffstat (limited to 'builtins')
-rw-r--r--builtins/array.c11
-rw-r--r--builtins/array.h1
2 files changed, 12 insertions, 0 deletions
diff --git a/builtins/array.c b/builtins/array.c
index 9c393699..bf1fe4d8 100644
--- a/builtins/array.c
+++ b/builtins/array.c
@@ -221,6 +221,17 @@ public Int_t Array$find(array_t arr, void *item, const TypeInfo *type)
return I(0);
}
+public void *Array$first(array_t arr, closure_t predicate)
+{
+ bool (*is_good)(void*, void*) = (void*)predicate.fn;
+ for (int64_t i = 0; i < arr.length; i++) {
+ if (is_good(arr.data + i*arr.stride, predicate.userdata))
+ return arr.data + i*arr.stride;
+ }
+ return NULL;
+}
+
+
public void Array$sort(array_t *arr, closure_t comparison, int64_t padded_item_size)
{
if (arr->data_refcount != 0 || (int64_t)arr->stride != padded_item_size)
diff --git a/builtins/array.h b/builtins/array.h
index 8f56d1c5..47d10fd1 100644
--- a/builtins/array.h
+++ b/builtins/array.h
@@ -69,6 +69,7 @@ void Array$remove_item(array_t *arr, void *item, Int_t max_removals, const TypeI
#define Array$remove_item_value(arr, item_expr, max, type) ({ __typeof(item_expr) item = item_expr; Array$remove_item(arr, &item, max, type); })
Int_t Array$find(array_t arr, void *item, const TypeInfo *type);
#define Array$find_value(arr, item_expr, type) ({ __typeof(item_expr) item = item_expr; Array$find(arr, &item, type); })
+void *Array$first(array_t arr, closure_t predicate);
void Array$sort(array_t *arr, closure_t comparison, int64_t padded_item_size);
array_t Array$sorted(array_t arr, closure_t comparison, int64_t padded_item_size);
void Array$shuffle(array_t *arr, int64_t padded_item_size);