1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
#lang typed/racket/base
(require racket/fixnum
racket/performance-hint
"../unsafe.rkt")
(provide for/vector: for*/vector: vector-ref!)
(begin-encourage-inline
(: vector-ref!
(All (A B) (case-> ((Vectorof (U A False)) Integer (-> A) -> A)
((Vectorof (U A B)) Integer (-> A) (Any -> Boolean : B) -> A))))
(define vector-ref!
(case-lambda
[(vs i thnk) (vector-ref! vs i thnk not)]
[(vs i thnk nothing?)
(define n (vector-length vs))
(cond [(and (fixnum? i) (i . fx>= . 0) (i . fx< . n))
(define v (unsafe-vector-ref vs i))
(if (nothing? v)
(let ([v (thnk)])
(unsafe-vector-set! vs i v)
v)
v)]
[else
(raise-range-error 'vector-ref! "Vector" "" i vs 0 n #f)])]))
) ; begin-encourage-inline
|