mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
v.gen.js: implement most of array and map methods in builtin/js (#10806)
This commit is contained in:
114
vlib/builtin/js/array.js.v
Normal file
114
vlib/builtin/js/array.js.v
Normal file
@ -0,0 +1,114 @@
|
||||
module builtin
|
||||
|
||||
struct array {
|
||||
arr JS.Array
|
||||
pub:
|
||||
len int
|
||||
}
|
||||
|
||||
#function flatIntoArray(target, source, sourceLength, targetIndex, depth) {
|
||||
#"use strict";
|
||||
#
|
||||
#for (var sourceIndex = 0; sourceIndex < sourceLength; ++sourceIndex) {
|
||||
#if (sourceIndex in source) {
|
||||
#var element = source[sourceIndex];
|
||||
#if (depth > 0 && Array.isArray(element))
|
||||
#targetIndex = flatIntoArray(target, element, element.length, targetIndex, depth - 1);
|
||||
#else {
|
||||
#target[targetIndex] = element;
|
||||
#++targetIndex;
|
||||
#}
|
||||
#}
|
||||
#}
|
||||
#return targetIndex;
|
||||
#}
|
||||
#function flatArray(target,depth) {
|
||||
#var array = target
|
||||
#var length = array.length;
|
||||
#var depthNum = 1;
|
||||
#
|
||||
#if (depth !== undefined)
|
||||
#depthNum = +depth
|
||||
#
|
||||
#var result = []
|
||||
#
|
||||
#flatIntoArray(result, array, length, 0, depthNum);
|
||||
#return result;
|
||||
#}
|
||||
|
||||
[unsafe]
|
||||
pub fn (a array) repeat_to_depth(count int, depth int) array {
|
||||
if count < 0 {
|
||||
panic('array.repeat: count is negative: $count')
|
||||
}
|
||||
mut arr := empty_array()
|
||||
#let tmp = new Array(a.arr.length * +count);
|
||||
#tmp.fill(a.arr);
|
||||
#
|
||||
#arr.arr = flatArray(tmp,depth+1);
|
||||
|
||||
return arr
|
||||
}
|
||||
|
||||
fn (a array) get(ix int) voidptr {
|
||||
mut result := voidptr(0)
|
||||
#result = a.arr[ix]
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
pub fn (a array) repeat(count int) array {
|
||||
unsafe {
|
||||
return a.repeat_to_depth(count, 0)
|
||||
}
|
||||
}
|
||||
|
||||
fn empty_array() array {
|
||||
mut arr := array{}
|
||||
#arr = new array([])
|
||||
|
||||
return arr
|
||||
}
|
||||
|
||||
fn (a &array) set_len(i int) {
|
||||
#a.arr.length=i
|
||||
}
|
||||
|
||||
pub fn (mut a array) sort_with_comparator(compare voidptr) {
|
||||
#a.arr.sort(compare)
|
||||
}
|
||||
|
||||
pub fn (mut a array) sort() {
|
||||
#a.arr.sort()
|
||||
}
|
||||
|
||||
pub fn (a array) index(v string) int {
|
||||
for i in 0 .. a.len {
|
||||
#if (a.arr[i].toString() == v.toString())
|
||||
|
||||
{
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
pub fn (a array) slice(start int, end int) array {
|
||||
mut result := a
|
||||
#result = new array(a.arr.slice(start,end))
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
pub fn (mut a array) insert(i int, val voidptr) {
|
||||
#a.arr.splice(i,0,val)
|
||||
}
|
||||
|
||||
fn (a array) push(val voidptr) {
|
||||
#a.arr.push(val)
|
||||
}
|
||||
|
||||
#array.prototype[Symbol.iterator] = function () { return this.arr[Symbol.iterator](); }
|
||||
#array.prototype.entries = function () { return this.arr.entries(); }
|
||||
#array.prototype.map = function(callback) { return this.arr.map(callback); }
|
||||
#array.prototype.filter = function(callback) { return this.arr.filter(callback); }
|
Reference in New Issue
Block a user