summaryrefslogtreecommitdiff
path: root/lib/std/slpush.myr
diff options
context:
space:
mode:
Diffstat (limited to 'lib/std/slpush.myr')
-rw-r--r--lib/std/slpush.myr20
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/std/slpush.myr b/lib/std/slpush.myr
new file mode 100644
index 0000000..b30b1e2
--- /dev/null
+++ b/lib/std/slpush.myr
@@ -0,0 +1,20 @@
+use "types.use"
+use "alloc.use"
+
+pkg std =
+ generic slpush : (sl : @a[:], elt : @a -> @a[:])
+;;
+
+generic slpush = {sl, elt
+ /*
+ slpush relies on implementation details
+ of slgrow for efficiency. Because bucket
+ sizes come in powers of two for all buckets
+ <= 32k, and we only reallocate when we hit
+ a bucket boundary, this is effectively
+ growing the slice by powers of two.
+ */
+ sl = slgrow(sl, sl.len + 1)
+ sl[sl.len - 1] = elt
+ -> sl
+}