#[forbid(deprecated_mode)];

/*!
 * A functional key,value store that works on anything.
 *
 * This works using a binary search tree. In the first version, it's a
 * very naive algorithm, but it will probably be updated to be a
 * red-black tree or something else.
 *
 * This is copied and modified from treemap right now. It's missing a lot
 * of features.
 */

use core::cmp::{Eq, Ord};
use option::{Some, None};
use option = option;

pub type Treemap<K, V> = @TreeNode<K, V>;

enum TreeNode<K, V> {
    Empty,
    Node(@K, @V, @TreeNode<K, V>, @TreeNode<K, V>)
}

/// Create a treemap
pub fn init<K, V>() -> Treemap<K, V> { @Empty }

/// Insert a value into the map
pub fn insert<K: Copy Eq Ord, V: Copy>(m: Treemap<K, V>, k: K, v: V)
  -> Treemap<K, V> {
    @match m {
       @Empty => Node(@k, @v, @Empty, @Empty),
       @Node(@copy kk, vv, left, right) => {
         if k < kk {
             Node(@kk, vv, insert(left, k, v), right)
         } else if k == kk {
             Node(@kk, @v, left, right)
         } else { Node(@kk, vv, left, insert(right, k, v)) }
       }
     }
}

/// Find a value based on the key
pub fn find<K: Eq Ord, V: Copy>(m: Treemap<K, V>, k: K) -> Option<V> {
    match *m {
      Empty => None,
      Node(@ref kk, @copy v, left, right) => {
        if k == *kk {
            Some(v)
        } else if k < *kk { find(left, move k) } else { find(right, move k) }
      }
    }
}

/// Visit all pairs in the map in order.
pub fn traverse<K, V: Copy>(m: Treemap<K, V>, f: fn((&K), (&V))) {
    match *m {
      Empty => (),
      /*
        Previously, this had what looked like redundant
        matches to me, so I changed it. but that may be a
        de-optimization -- tjc
       */
      Node(@ref k, @ref v, left, right) => {
        traverse(left, f);
        f(k, v);
        traverse(right, f);
      }
    }
}
