js-on-sx: Array.prototype flat + fill; fix indexOf start arg
flat: walk with depth, recursive when element is list and depth>0. fill(value, start?, end?): in-place mutation, returns self. indexOf: honor second arg as start position. 396/398 unit (+5), 148/148 slice unchanged.
This commit is contained in:
@@ -775,7 +775,13 @@
|
||||
((= name "indexOf")
|
||||
(fn
|
||||
(&rest args)
|
||||
(if (= (len args) 0) -1 (js-list-index-of arr (nth args 0) 0))))
|
||||
(if
|
||||
(= (len args) 0)
|
||||
-1
|
||||
(js-list-index-of
|
||||
arr
|
||||
(nth args 0)
|
||||
(if (< (len args) 2) 0 (js-num-to-int (nth args 1)))))))
|
||||
((= name "join")
|
||||
(fn
|
||||
(&rest args)
|
||||
@@ -810,6 +816,25 @@
|
||||
((= name "every") (fn (f) (js-list-every-loop f arr 0)))
|
||||
((= name "reverse")
|
||||
(fn () (js-list-reverse-loop arr (- (len arr) 1) (list))))
|
||||
((= name "flat")
|
||||
(fn
|
||||
(&rest args)
|
||||
(let
|
||||
((depth (if (= (len args) 0) 1 (js-num-to-int (nth args 0)))))
|
||||
(js-list-flat-loop arr depth (list)))))
|
||||
((= name "fill")
|
||||
(fn
|
||||
(&rest args)
|
||||
(let
|
||||
((v (if (= (len args) 0) js-undefined (nth args 0)))
|
||||
(s (if (< (len args) 2) 0 (js-num-to-int (nth args 1))))
|
||||
(e
|
||||
(if
|
||||
(< (len args) 3)
|
||||
(len arr)
|
||||
(js-num-to-int (nth args 2)))))
|
||||
(js-list-fill-loop arr v s e)
|
||||
arr)))
|
||||
(else js-undefined))))
|
||||
|
||||
(define pop-last! (fn (lst) nil))
|
||||
@@ -960,6 +985,30 @@
|
||||
((js-to-boolean (f (nth arr i))) true)
|
||||
(else (js-list-some-loop f arr (+ i 1))))))
|
||||
|
||||
(define
|
||||
js-list-flat-loop
|
||||
(fn
|
||||
(arr depth acc)
|
||||
(for-each
|
||||
(fn
|
||||
(x)
|
||||
(if
|
||||
(and (list? x) (> depth 0))
|
||||
(js-list-flat-loop x (- depth 1) acc)
|
||||
(append! acc x)))
|
||||
arr)
|
||||
acc))
|
||||
|
||||
(define
|
||||
js-list-fill-loop
|
||||
(fn
|
||||
(arr v s e)
|
||||
(cond
|
||||
((>= s e) nil)
|
||||
((>= s (len arr)) nil)
|
||||
(else
|
||||
(begin (js-list-set! arr s v) (js-list-fill-loop arr v (+ s 1) e))))))
|
||||
|
||||
(define
|
||||
js-list-every-loop
|
||||
(fn
|
||||
@@ -1219,6 +1268,8 @@
|
||||
((= key "some") (js-array-method obj "some"))
|
||||
((= key "every") (js-array-method obj "every"))
|
||||
((= key "reverse") (js-array-method obj "reverse"))
|
||||
((= key "flat") (js-array-method obj "flat"))
|
||||
((= key "fill") (js-array-method obj "fill"))
|
||||
(else js-undefined)))
|
||||
((= (type-of obj) "string")
|
||||
(cond
|
||||
|
||||
Reference in New Issue
Block a user