#lang typed/scheme
(provide (all-defined-out))
(: remf (All (X) ((X -> Boolean) [Listof X] -> [Listof X])))
(define (remf f ls)
(cond [(empty? ls) empty]
[(f (first ls)) (rest ls)]
[else
(cons (first ls)
(remf f (rest ls)))]))
(: interleave (All (X) (X [Listof X] -> [Listof X])))
(define (interleave x ys)
(cond [(empty? ys) ys]
[(empty? (rest ys)) (list (first ys))]
[else
(cons (first ys)
(cons x
(interleave x (rest ys))))]))
(: replace-at (All (X) ([Listof X] X Integer -> [Listof X])))
(define (replace-at ls x i)
(append (take ls i)
(list x)
(drop ls (add1 i))))
(: remove-at (All (X) ([Listof X] Integer -> [Listof X])))
(define (remove-at ls i)
(append (take ls i)
(drop ls (add1 i))))