shape-runtime 0.3.1

Bytecode compiler, builtins, and runtime infrastructure for Shape
Documentation
/// @module std::core::array_iterable
/// Iterable implementation for Array (Vec<T>).
///
/// Most methods now have pure Shape implementations.
/// Pure Shape fallbacks for methods without native dispatch.

impl Iterable for Array {
    method findIndex(predicate) {
        for i in 0..self.len() {
            if predicate(self[i]) { return i }
        }
        -1
    }

    method zip(other) {
        let result = [];
        let n = if self.len() < other.len() { self.len() } else { other.len() };
        let i = 0;
        while i < n {
            result.push([self[i], other[i]]);
            i = i + 1;
        }
        result
    }

    method chunk(size) {
        let result = [];
        let i = 0;
        while i < self.len() {
            result.push(self.slice(i, i + size));
            i = i + size;
        }
        result
    }

    method flatten() {
        let mut result = []
        for item in self {
            for sub in item { result.push(sub) }
        }
        result
    }

    method slice(start, end) {
        let mut result = []
        let mut i = start
        while i < end && i < self.len() {
            result.push(self[i])
            i = i + 1
        }
        result
    }

    method join(separator) {
        let mut result = ""
        for i in 0..self.len() {
            if i > 0 { result = result + separator }
            result = result + self[i].toString()
        }
        result
    }

    method sortBy(key_fn) {
        self.sort(|a, b| {
            let ka = key_fn(a);
            let kb = key_fn(b);
            if ka < kb { -1 }
            else if ka > kb { 1 }
            else { 0 }
        })
    }

    method take(n) { self.slice(0, n) }

    method skip(n) { self.slice(n, self.len()) }

    method enumerate() {
        let result = [];
        let i = 0;
        while i < self.len() {
            result.push({ index: i, value: self[i] });
            i = i + 1;
        }
        result
    }
}