(include "lib/core.scm")
(include "lib/pair.scm")
(include "lib/string.scm")
(include "lib/random.scm")
(include "lib/frb.scm")

(define (n-random n)
  (let loop ((n n)
	     (t (tree:empty)))
    (if (= n 0)
	t
	(loop (- n 1) (tree/insert t < (random) (random))))))

(define (print-spaces n)
  (let loop ((n n))
    (cond ((> n 0)
	   (print-string "  ")
	   (loop (- n 1))))))

(define (print-item k v d)
  (print-spaces d)
  (print k)
  (print-string ":")
  (print v)
  (print-string "\n"))

(define (tree/print n)
  (let p ((n n) (d 0))
    (vcase tree n
      ((:empty) #u)
      ((:red    l r k v) (p l (+ d 1)) (print-item k v d) (p r (+ d 1)))
      ((:purple l r k v) (p l (+ d 1)) (print-item k v d) (p r (+ d 1))))
    ))

(define (print-kv k v)
  (print k)
  (print-string " ")
  (print v)
  (print-string "\n"))

(srandom 314159)

(let ((t (n-random 20))
      (t2 (tree:empty))
      )
  (print-string "inorder:\n")
  (tree/inorder print-kv t)
  (print-string "reverse:\n")
  (tree/reverse print-kv t)
  (set! t (tree/insert t < 1234 5000))
  (printn (tree/member t < 1234))
  (printn (tree/member t < 9999))
  (tree/print t)
  (set! t2 (tree/insert t2 string<? "howdy" 0))
  (set! t2 (tree/insert t2 string<? "there" 2))
  (tree/print t2)
  (let ((probe (tree/member t2 string<? "there")))
    (vcase maybe probe
      ((:no) (printn "nope") #t)
      ((:yes val) (printn val) #t)))
  )