From 5d80e242244501a5eb256a72ed6ad5ca180bc49d Mon Sep 17 00:00:00 2001 From: Andrea Piseri Date: Thu, 23 Dec 2021 12:49:40 +0100 Subject: [PATCH] Add slice/scanner proc --- core/slice/slice.odin | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/core/slice/slice.odin b/core/slice/slice.odin index a82c5fa96..69aae1e39 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -304,6 +304,27 @@ filter :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator) - return r[:] } +scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U)->V, allocator := context.allocator) -> []V { + if len(s) == 0 { return {} } + p := as_ptr(s) + + res := make([]V, len(s), allocator) + + q := as_ptr(res) + l := len(res) + + r := initializer + + for l > 0 { + r = f(r, p^) + q^ = r + p = intrinsics.ptr_offset(p, 1) + q = intrinsics.ptr_offset(q, 1) + l -= 1 + } + + return res +} min :: proc(s: $S/[]$T) -> (res: T, ok: bool) where intrinsics.type_is_ordered(T) #optional_ok {