;; -*- Mode: Irken -*-

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

(define n-random
  t 0 -> t
  t n -> (n-random (tree/insert t < (random) (random)) (- n 1)))

(define indent
  0 -> #u
  n -> (begin (print-string "  ") (indent (- n 1))))

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

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

(srandom 314159)

(let ((t (n-random (tree/empty) 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/dump 0 print-item t)
  (set! t2 (tree/insert t2 string<? "howdy" 0))
  (set! t2 (tree/insert t2 string<? "there" 2))
  (tree/dump 0 print-item t2)
  (let ((probe (tree/member t2 string<? "there")))
    (vcase maybe probe
      ((:no) (printn "nope") #t)
      ((:yes val) (printn val) #t)))
  )