+;; list
+
+(define (functional-or . rest)
+ (if (pair? rest)
+ (or (car rest)
+ (apply functional-and (cdr rest)))
+ #f))
+
+(define (functional-and . rest)
+ (if (pair? rest)
+ (and (car rest)
+ (apply functional-and (cdr rest)))
+ #t))
+
+(define (split-list lst n)
+ "Split LST in N equal sized parts"
+
+ (define (helper todo acc-vector k)
+ (if (null? todo)
+ acc-vector
+ (begin
+ (if (< k 0)
+ (set! k (+ n k)))
+
+ (vector-set! acc-vector k (cons (car todo) (vector-ref acc-vector k)))
+ (helper (cdr todo) acc-vector (1- k)))))
+
+ (helper lst (make-vector n '()) (1- n)))
+
+(define (list-element-index lst x)
+ (define (helper todo k)
+ (cond
+ ((null? todo) #f)
+ ((equal? (car todo) x) k)
+ (else
+ (helper (cdr todo) (1+ k)))))
+
+ (helper lst 0))
+
+(define-public (count-list lst)
+ "Given lst (E1 E2 .. ) return ((E1 . 1) (E2 . 2) ... ) "
+
+ (define (helper l acc count)
+ (if (pair? l)
+ (helper (cdr l) (cons (cons (car l) count) acc) (1+ count))
+ acc))
+
+
+ (reverse (helper lst '() 1)))
+
+(define-public (list-join lst intermediate)
+ "put INTERMEDIATE between all elts of LST."
+
+ (fold-right
+ (lambda (elem prev)
+ (if (pair? prev)
+ (cons elem (cons intermediate prev))
+ (list elem)))
+ '() lst))
+
+(define-public (filtered-map proc lst)
+ (filter
+ (lambda (x) x)
+ (map proc lst)))
+