#lang mzscheme

(#%provide (all-defined))

;;; Copy general programming stuff into this file as you need them

;;;;;;;;;;;;;;;;;;
;;; FUNCTIONAL;;;;
;;;;;;;;;;;;;;;;;;
(define (curry f . xs)
  (lambda ys
    (apply f (append xs ys))))

(define (compose f . gs)
  (if (null? gs)
      f
      (lambda xs 
        (f (apply (apply compose gs) xs)))))

(define ((flip f) x y) (f y x))

;;;;;;;;;;;;;;;;;;;;
;;;High Order;;;;;;;
;;;;;;;;;;;;;;;;;;;;
(define (fold-right g s l)
  (if (null? l)
      s
      (g (car l) (fold-right g s (cdr l)))))

(define (fold-left f t l)
  (if (null? l)
      t
      (fold-left f (f t (car l)) (cdr l))))


;;;;;;;;;;;;;;;;;;
;;;LIST;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;

(define (intersperse obj lst)
  (if (null? (cdr lst))
      lst
      (cons (car lst) (cons obj (intersperse obj (cdr lst))))))




;;;;;;;;;;;;;;;;;
;;;;;TREEE;;;;;;;
;;;;;;;;;;;;;;;;;
(define (tree-size x)
  (if (list? x)
      (fold-right (lambda (y ac) (+ ac (tree-size y))) 0 x)
      1))