Login
7 branches 0 tags
Ben (Win10) Nicer wasm REPL, also added placeholders for an editor 2ce3060 4 years ago 344 Commits
nujel / stdlib / array.nuj
; Nujel - Copyright (C) 2020-2021 - Benjamin Vincent Schulenburg
; This project uses the MIT license, a copy should be included under /LICENSE

;; Some functions dealing with arrays

[defun array/+= [a i v]
       "Add V to the value in A at position I and store the result in A returning A"
       [array/set! a i [+ v [array/ref a i]]]]

[defun array/++ [a i]
       "Increment position I in A and return A"
       [array/+= a i 1]]

[defun array/fill! [a v i]
       "Fills array a with value v"
       [def len [array/length a]]
       [for [i 0 len]
            [array/set! a i v]]
       a]

[defun array/append [a b]
       [when-not [and [arr? a] [arr? b]] [throw [list :type-error "array/append expects two arrays as its arguments" #nil [current-lambda]]]]
       [def ret [array/allocate [+ [array/length a] [array/length b]]]]
       [for [i 0 [array/length a]]
            [array/set! ret i [a i]]]
       [for [i [array/length a] [array/length ret]]
            [array/set! ret i [b [- i [array/length a]]]]]
       ret]

[defun array/dup [a]
       [array/append a #[]]]

[defun array/reduce [arr fun α]
       [def len [array/length arr]]
       [for [i 0 len]
              [set! α [fun α [arr i]]]]
       α]

[defun array/map [arr fun]
       [def len [array/length arr]]
       [for [i 0 len]
              [array/set! arr i [fun [arr i]]]]
       arr]

[defun array/filter [arr pred]
       [def ri 0]
       [def len [array/length arr]]
       [def ret [array/allocate len]]
       [for [ai 0 len]
              [when [pred [arr ai]]
                    [array/set! ret ri [arr ai]]
                    [++ ri]]]
       [array/length! ret ri]]