Login
7 branches 0 tags
Ben (X13/Void) Added breaking of calculations via C-c 9620fb0 4 years ago 291 Commits
nujel / stdlib / 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 :invalid-type "You can only use ref with a collection" l [current-lambda]]]]
       ]
]

[defun filter [p l]
       "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 p l]]
             [[:array] [array/filter p l]]
             [otherwise [throw [list :invalid-type "You can only use filter with a collection" l [current-lambda]]]]
       ]
]

[defun reduce [f l α]
       "Combine all elements in collection l using operation F and starting value α"
       [case [type-of l]
             [[:nil]    α]
             [[:pair]   [list/reduce f l α]]
             [[:array]  [array/reduce f l α]]
             [otherwise [throw [list :invalid-type "You can only use reduce with a collection" l [current-lambda]]]]
       ]
]

[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 :invalid-type "You can only use length with a collection" α [current-lambda]]]]
       ]
]

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