(module list-util mzscheme
(provide lookup
trim-list
repeat-list
end-list
index-of)
;; lookup: (listof X) (Y -> Boolean) (X -> Y) (Y -> Z) -> (list-of Z)
;; Lookup from a list using pred? to choose things accessed by
;; 'acc', if pred? returns #t then use 'res' to get the result
(define (lookup lst pred? acc res)
(lookup* lst pred? acc res '()))
;; lookup*: (listof X) (Y -> Boolean) (X -> Y) (Y -> Z) (list-of Z) -> (list-of Z)
;; Lookup from a list using pred? accumulating the results
(define (lookup* lst pred? acc res ret)
(if (null? lst) ret
(let ((nret (if (pred? (acc (car lst)))
(cons (res (car lst)) ret)
ret)))
(lookup* (cdr lst) pred? acc res nret))))
;; trim-list: (listof Any) Number -> (listof Any)
;; Trim off the end of the list, leaving at most 'n' elements
(define (trim-list lst n)
(if (or (null? lst) (= n 0)) '()
(cons (car lst) (trim-list (cdr lst) (- n 1)))))
;; end-list: (listof Any) Number -> (listof Any)
;; remove the first 'n'elements of the list, returning the end
(define (end-list lst n)
(cond [(null? lst) '()]
[(= n 0) lst]
[else (end-list (cdr lst) (- n 1))]))
;; repeat-list: X Number -> (listof X)
;; Create a List of x that is has 'n' elements
(define (repeat-list x n)
(if (= n 0) '()
(cons x (repeat-list x (- n 1)))))
;; index-of: (X -> boolean) (listof X) -> number
;; Return the index of the first element for which pred? returns true
(define (index-of pred? lst)
(index-of-start pred? lst 0))
;; index-of: (X -> boolean) (listof X) number -> number
;; Return the index of the first element for which pred? returns true
;; starting at index 'n'
(define (index-of-start pred? lst n)
(cond [(null? lst) -1]
[(pred? (car lst)) n]
[else (index-of-start pred? (cdr lst) (+ n 1))]))
)