Login
7 branches 0 tags
Ben (Win10) Fixed [procedure?] and added tests ae12f63 3 years ago 420 Commits
nujel / stdlib / collections / collection_primitives.nuj
; Nujel - Copyright (C) 2020-2021 - Benjamin Vincent Schulenburg
; This project uses the MIT license, a copy should be included under /LICENSE

;; A bunch of procedurs working on procedures, using type specialized λs

[defun ref [l i]
       "Return whatver is at position I in L"
       [case [type-of l]
             [[:nil]               #nil]
             [[:tree]   [tree/ref  l i]]
             [[:string] [char-at   l i]]
             [[:array]  [array/ref l i]]
             [[:pair]   [list/ref  l i]]
             [otherwise [throw [list :type-error "You can only use ref with a collection" l [current-lambda]]]]]]

[defun filter [l p]
       "Runs predicate p over every item in collection l and returns a list consiting solely of items where p is true"
       [case [type-of l]
             [[:nil] #nil]
             [[:pair] [list/filter l p]]
             [[:array] [array/filter l p]]
             [otherwise [throw [list :type-error "You can only use filter with a collection" l [current-lambda]]]]]]

[defun reduce [l f α]
       "Combine all elements in collection l using operation F and starting value α"
       [case [type-of l]
             [[:nil]    α]
             [[:pair]   [list/reduce l f α]]
             [[:array]  [array/reduce l f α]]
             [otherwise [f α l]]]]

[defun length [α]
       "Returns the length of collection α"
       [case [type-of α]
             [[:nil]                    0]
             [[:array]  [array/length  α]]
             [[:pair]   [list/length   α]]
             [[:string] [string/length α]]
             [[:tree]   [tree/size     α]]
             [otherwise [throw [list :type-error "You can only use length with a collection" α [current-lambda]]]]]]

[defun map [l f]
       "Runs f over every item in collection l and returns the resulting list"
       [case [type-of l]
             [[:nil] #nil]
             [[:pair] [list/map l f]]
             [[:array] [array/map l f]]
             [otherwise [throw [list :type-error "You can only use map with a collection" l [current-lambda]]]]]]

[defun sort [l]
       "Sorts the collection L"
       [case [type-of l]
             [:pair [list/sort l]]
             [:array [array/sort l]]
             [otherwise [throw [list :type-error "You can only use sort with a collection" l [current-lambda]]]]]]

[defun member [l m]
       "Returns the first pair/item of collection l whose car is equal to m"
       [case [type-of l]
             [:pair [list/member l m]]
             [:tree [tree/get l m]]
             [otherwise [throw [list :type-error "You can only use member with a collection" l [current-lambda]]]]]]

[defun collection? [l]
       [case [type-of l]
             [[:pair :array] #t]
             [otherwise #f]]]