added: `slice.group_by`
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 19 Oct 2023 19:36:05 +0000 (14:36 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 19 Oct 2023 19:36:05 +0000 (14:36 -0500)
core/container/slice.onyx
core/std.onyx

index 8494710484e8840c6a26f285fcf6b66806e69865..41d12081b72efd834e219781162f8f4780b5da39 100644 (file)
@@ -620,6 +620,33 @@ chunks :: (arr: [] $T, width: i32) -> Iterator([] T) {
 }
 
 
+#doc """
+"""
+group_by :: #match #local {}
+
+#overload
+group_by :: macro (arr: [] $T, comp: (T, T) -> bool, allocator := context.allocator) -> [..] [] T {
+    return #this_package.group_by(arr, [a, b](comp(a, b)), allocator);
+}
+
+#overload
+group_by :: macro (arr_: [] $T, comp: Code, allocator := context.allocator) -> [..] [] T {
+    out := make([..] [] T, allocator);
+    start := 0;
+    arr := arr_;
+    for i: 1 .. arr.count {
+        if !#unquote comp(arr[start], arr[i]) {
+            out << arr[start .. i];
+            start = i;
+        }
+    }
+
+    out << arr[start .. arr.count];
+    return out;
+}
+
+
+
 #local HasEquals :: interface (t: $T) {
     { t == t } -> bool;
 }
index 75d74d65c8981cd990b9b5adb501a5fb1edee991..ab028a0380160701e2689e80d722be36ce5548e6 100644 (file)
@@ -54,11 +54,11 @@ use runtime
 #load "./test/testing"
 
 #load "./time/time"
+#load "./time/date"
 
 #load "./misc/arg_parse"
 #load "./misc/method_ops"
 
-#load "./time/date"
 #load "./encoding/base64"
 #load "./encoding/hex"
 #load "./encoding/utf8"