diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-08-18 22:28:04 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-08-18 22:28:04 -0400 |
| commit | 7472837ee5a00bd9313e82f71f55b6f76ee7083b (patch) | |
| tree | 57b9b9f5823f2b58fbcf6e25901bc307e0df27fa /builtins | |
| parent | 19c51194f0b2ad945bfb7b544032210274b431dd (diff) | |
Add array:first(predicate:func(x:&T)->Bool)->@%T?
Diffstat (limited to 'builtins')
| -rw-r--r-- | builtins/array.c | 11 | ||||
| -rw-r--r-- | builtins/array.h | 1 |
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); |
