scribble-enhanced/graph-lib/lib/low/list.rkt
2016-03-02 18:12:17 +01:00

41 lines
1.6 KiB
Racket

#lang typed/racket
(require "typed-untyped.rkt")
(define-typed/untyped-modules #:no-test
(provide indexof
replace-first
map+fold)
(: indexof ( (A B) ( A (Listof B) ( A B Any) (U #f Integer))))
(define (indexof elt lst [compare equal?])
(let rec ([lst lst] [index 0])
(if (null? lst)
#f
(if (compare elt (car lst))
index
(rec (cdr lst) (+ index 1))))))
(: replace-first ( (A B C) (->* (B
C
(Listof (U A B)))
(#:equal? ( (U A B) (U A B) Any : #:+ B))
(Rec R (U (Pairof (U A B) R)
Null
(Pairof C (Listof (U A B))))))))
(define (replace-first from to l #:equal? [equal? eq?])
(if (null? l)
'()
(if (equal? from (car l))
(cons to (cdr l))
(cons (car l)
(replace-first from to (cdr l))))))
(: map+fold ( (E R A) ( ( E A (values R A)) A (Listof E)
(Values (Listof R) A))))
(define (map+fold f init-acc lst)
(let ([result (foldl (λ ([item : E] [acc : (Pairof (Listof R) A)])
(let-values ([(item new-acc) (f item (cdr acc))])
(cons (cons item (car acc))
new-acc)))
(cons '() init-acc)
lst)])
(values (car result) (cdr result)))))