diff --git a/RELEASES.md b/RELEASES.md index 15c54c99..391aab71 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -30,6 +30,7 @@ Enhancements * `Position` now implements `Add` and `AddAssign`. * `Scope` now implements `IntoIterator`. * Strings now have the `split_rev` method and variations of `split` with maximum number of segments. +* Arrays now have the `split` method. Version 0.19.12 diff --git a/src/packages/array_basic.rs b/src/packages/array_basic.rs index bb1258d1..d9618e67 100644 --- a/src/packages/array_basic.rs +++ b/src/packages/array_basic.rs @@ -3,7 +3,7 @@ use crate::engine::{OP_EQUALS, TYPICAL_ARRAY_SIZE}; use crate::plugin::*; -use crate::stdlib::{any::TypeId, boxed::Box, cmp::max, cmp::Ordering, string::ToString}; +use crate::stdlib::{any::TypeId, boxed::Box, cmp::max, cmp::Ordering, mem, string::ToString}; use crate::{ def_package, Array, Dynamic, EvalAltResult, FnPtr, ImmutableString, NativeCallContext, Position, INT, @@ -191,6 +191,18 @@ mod array_functions { array[start..].iter().cloned().collect() } + #[rhai_fn(name = "split")] + pub fn split_at(array: &mut Array, start: INT) -> Array { + if start <= 0 { + mem::take(array) + } else if start as usize >= array.len() { + Default::default() + } else { + let mut result: Array = Default::default(); + result.extend(array.drain(start as usize..)); + result + } + } #[rhai_fn(return_raw)] pub fn map( ctx: NativeCallContext,