40 lines
1.2 KiB
Racket
40 lines
1.2 KiB
Racket
#lang racket/base
|
|
|
|
;; Extra functions that can't be easily categorized (i.e. math, vector).
|
|
|
|
(require racket/sequence racket/list)
|
|
|
|
(provide (all-defined-out))
|
|
|
|
|
|
(define (sequence-take seq start end)
|
|
(for/list ([e (sequence-tail seq start)]
|
|
[_ (in-range (- end start))])
|
|
e))
|
|
|
|
(define (list-index v lst [equal? equal?])
|
|
(let loop ([lst lst] [idx 0])
|
|
(cond [(null? lst) -1]
|
|
[(equal? v (car lst)) idx]
|
|
[else (loop (cdr lst) (add1 idx))])))
|
|
|
|
(define (assoc-cons hash key new-value)
|
|
(let loop ([hash hash])
|
|
(cond [(empty? hash) (list (cons key (list new-value)))]
|
|
[else
|
|
(define entry (first hash))
|
|
(cond [(equal? (car entry) key) (cons (cons key (cons new-value (cdr entry)))
|
|
(rest hash))]
|
|
[else (cons (first hash) (loop (rest hash)))])])))
|
|
|
|
(define (vector-find-index pred? xs [start 0] [end (vector-length xs)])
|
|
(for/first ([i (in-range start end)]
|
|
#:when (pred? (vector-ref xs i)))
|
|
i))
|
|
|
|
(define ((sorted-apply sort f) lst)
|
|
(define h
|
|
(let ([sorted-lst (sort lst)])
|
|
(make-hash (map cons sorted-lst (f sorted-lst)))))
|
|
(map (λ (e) (hash-ref h e)) lst))
|