Convert std::deque over to an iface
diff --git a/src/libstd/deque.rs b/src/libstd/deque.rs
index 05c3c6c..f76d0f5 100644
--- a/src/libstd/deque.rs
+++ b/src/libstd/deque.rs
@@ -1,3 +1,5 @@
+import option::{some, none};
+
 /*
 Module: deque
 
@@ -5,9 +7,9 @@
 */
 
 /*
-Object: t
+Iface: t
 */
-type t<T> = obj {
+iface t<T> {
     // Method: size
     fn size() -> uint;
     // Method: add_front
@@ -24,7 +26,7 @@
     fn peek_back() -> T;
     // Method: get
     fn get(int) -> T;
-    };
+}
 
 /*
 Section: Functions
@@ -33,6 +35,8 @@
 /*
 Function: create
 */
+// FIXME eventually, a proper datatype plus an exported impl would be
+// preferrable
 fn create<T: copy>() -> t<T> {
     type cell<T> = option::t<T>;
 
@@ -51,79 +55,79 @@
         while i < nalloc {
             if i < nelts {
                 rv += [mutable elts[(lo + i) % nelts]];
-            } else { rv += [mutable option::none]; }
+            } else { rv += [mutable none]; }
             i += 1u;
         }
 
         ret rv;
     }
     fn get<T: copy>(elts: [mutable cell<T>], i: uint) -> T {
-        ret alt elts[i] { option::some(t) { t } _ { fail } };
+        ret alt elts[i] { some(t) { t } _ { fail } };
     }
-    obj deque<T: copy>(mutable nelts: uint,
-                      mutable lo: uint,
-                      mutable hi: uint,
-                      mutable elts: [mutable cell<T>]) {
-        fn size() -> uint { ret nelts; }
+
+    type repr<T> = {mutable nelts: uint,
+                    mutable lo: uint,
+                    mutable hi: uint,
+                    mutable elts: [mutable cell<T>]};
+
+    impl <T: copy> of t<T> for repr<T> {
+        fn size() -> uint { ret self.nelts; }
         fn add_front(t: T) {
-            let oldlo: uint = lo;
-            if lo == 0u {
-                lo = vec::len::<cell<T>>(elts) - 1u;
-            } else { lo -= 1u; }
-            if lo == hi {
-                elts = grow::<T>(nelts, oldlo, elts);
-                lo = vec::len::<cell<T>>(elts) - 1u;
-                hi = nelts;
+            let oldlo: uint = self.lo;
+            if self.lo == 0u {
+                self.lo = vec::len(self.elts) - 1u;
+            } else { self.lo -= 1u; }
+            if self.lo == self.hi {
+                self.elts = grow(self.nelts, oldlo, self.elts);
+                self.lo = vec::len(self.elts) - 1u;
+                self.hi = self.nelts;
             }
-            elts[lo] = option::some::<T>(t);
-            nelts += 1u;
+            self.elts[self.lo] = some(t);
+            self.nelts += 1u;
         }
         fn add_back(t: T) {
-            if lo == hi && nelts != 0u {
-                elts = grow::<T>(nelts, lo, elts);
-                lo = 0u;
-                hi = nelts;
+            if self.lo == self.hi && self.nelts != 0u {
+                self.elts = grow(self.nelts, self.lo, self.elts);
+                self.lo = 0u;
+                self.hi = self.nelts;
             }
-            elts[hi] = option::some::<T>(t);
-            hi = (hi + 1u) % vec::len::<cell<T>>(elts);
-            nelts += 1u;
+            self.elts[self.hi] = some(t);
+            self.hi = (self.hi + 1u) % vec::len(self.elts);
+            self.nelts += 1u;
         }
-
         /**
          * We actually release (turn to none()) the T we're popping so
          * that we don't keep anyone's refcount up unexpectedly.
          */
         fn pop_front() -> T {
-            let t: T = get::<T>(elts, lo);
-            elts[lo] = option::none::<T>;
-            lo = (lo + 1u) % vec::len::<cell<T>>(elts);
-            nelts -= 1u;
+            let t: T = get(self.elts, self.lo);
+            self.elts[self.lo] = none;
+            self.lo = (self.lo + 1u) % vec::len(self.elts);
+            self.nelts -= 1u;
             ret t;
         }
         fn pop_back() -> T {
-            if hi == 0u {
-                hi = vec::len::<cell<T>>(elts) - 1u;
-            } else { hi -= 1u; }
-            let t: T = get::<T>(elts, hi);
-            elts[hi] = option::none::<T>;
-            nelts -= 1u;
+            if self.hi == 0u {
+                self.hi = vec::len(self.elts) - 1u;
+            } else { self.hi -= 1u; }
+            let t: T = get(self.elts, self.hi);
+            self.elts[self.hi] = none;
+            self.nelts -= 1u;
             ret t;
         }
-        fn peek_front() -> T { ret get::<T>(elts, lo); }
-        fn peek_back() -> T { ret get::<T>(elts, hi - 1u); }
+        fn peek_front() -> T { ret get(self.elts, self.lo); }
+        fn peek_back() -> T { ret get(self.elts, self.hi - 1u); }
         fn get(i: int) -> T {
-            let idx: uint = (lo + (i as uint)) % vec::len::<cell<T>>(elts);
-            ret get::<T>(elts, idx);
+            let idx = (self.lo + (i as uint)) % vec::len(self.elts);
+            ret get(self.elts, idx);
         }
     }
-    let v: [mutable cell<T>] =
-        vec::init_elt_mut(option::none, initial_capacity);
-    ret deque::<T>(0u, 0u, 0u, v);
+
+    let repr: repr<T> = {
+        mutable nelts: 0u,
+        mutable lo: 0u,
+        mutable hi: 0u,
+        mutable elts: vec::init_elt_mut(none, initial_capacity)
+    };
+    repr as t::<T>
 }
-// Local Variables:
-// mode: rust;
-// fill-column: 78;
-// indent-tabs-mode: nil
-// c-basic-offset: 4
-// buffer-file-coding-system: utf-8-unix
-// End: