Change in the Ata module:
[tatoo.git] / src / naive_node_list.ml
index c148732..1b32c47 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;
@@ -40,19 +41,70 @@ let iter f l =
   loop l.head
 
 
+
+
 let length l = l.length
+let is_empty l = l.head == nil
+
+let pop l =
+  if is_empty l then failwith "pop"
+  else
+    let v = l.head.node in
+    let nhead = l.head.next in
+    l.head <- nhead;
+    if nhead == nil then l.last <- nil;
+    v
+
 
 
 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 append l1 l2 =
+  let len2 = l2.length in
+  if len2 != 0 then begin
+    l1.length <- l1.length + len2;
+    l1.last.next <- l2.head;
+    l1.last <- l2.last;
+  end;
+  l1
+
+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)