X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Fnaive_node_list.ml;fp=src%2Fnaive_node_list.ml;h=b6f0ae458e67bbb3d08156913f6b6bf6b4848d22;hp=c14873211347503bd6e6b54fb030a0729d6c0059;hb=172af8a5311dd53ad6df9e330d6917200441dd39;hpb=3406b26f1ea26a997d7f194c547439891c108ce6 diff --git a/src/naive_node_list.ml b/src/naive_node_list.ml index c148732..b6f0ae4 100644 --- a/src/naive_node_list.ml +++ b/src/naive_node_list.ml @@ -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)