Change the interface of node_list (fully imperative now)
[tatoo.git] / src / naive_node_list.ml
index c148732..b6f0ae4 100644 (file)
@@ -18,6 +18,7 @@ type node = Naive_tree.node
 type cell = { node : node;
               mutable next : cell }
 
+type iterator = cell
 
 type t = { mutable length : int;
            mutable head : cell;
@@ -41,18 +42,47 @@ let iter f l =
 
 
 let length l = l.length
-
+let is_empty l = l.head == nil
 
 let add n l =
   let ncell = { node = n;
                 next = nil }
   in
-  if l.last == nil then
-    { length = 1;
-      head = ncell;
-      last = ncell }
-  else
-    let () = l.last.next <- ncell in
-    { length = l.length + 1;
-      head = l.head;
-      last = ncell }
+  if l.head == nil then begin
+    l.head <- ncell;
+    l.last <- ncell;
+    l.length <- 1
+  end else begin
+    l.last.next <- ncell;
+    l.last <- ncell;
+    l.length <- l.length + 1
+  end
+
+let push_back n l = add n l
+let push_front n l =
+  let ncell = { node = n;
+                next = l.head }
+  in
+  if l.head == nil then begin
+    l.head <- ncell;
+    l.last <- ncell;
+    l.length <- 1;
+  end else begin
+    l.head <- ncell;
+    l.length <- l.length + 1;
+  end
+
+let head l = l.head
+let last l = l.last
+let next i = i.next
+let value i = i.node
+let finished i = i == nil
+
+let copy l =
+  let rec loop l2 i =
+    if finished i then l2 else begin
+      add (value i) l2;
+      loop l2 (next i)
+    end
+  in
+  loop (create ()) (head l)