#lang racket/base
(require racket/path
         racket/match)

(define (indent i)
  (for ([t (in-range i)])
    (printf "|")))

(define (dir-zo-size i p)
  (parameterize ([current-directory p])
    (define subdir? #f)
    (define (has-sub-dir!)
      (unless subdir?
        (indent i) (printf "~a:\n" p)
        (set! subdir? #t)))
    (define tot
      (for/fold ([size 0])
        ([p (in-list (directory-list))])
        (+
         (match p
           [(? directory-exists?) (has-sub-dir!) (dir-zo-size (add1 i) p)]
           [(app filename-extension #"zo") (file-size p)]
           [else 0])
         size)))
    (unless (zero? tot)
      (indent i) (printf "~a: ~a\n" p tot))
    tot))

(void (dir-zo-size 0 (simplify-path (build-path (collection-path "racket") 'up))))
