c_src: update Makefile to compile on MacOSX
[nit.git] / lib / standard / collection / list.nit
index 3a59a49..c5dc5dd 100644 (file)
@@ -116,6 +116,26 @@ class List[E]
                _head = node
        end
 
+       # O(n)
+       redef fun insert(e, i)
+       do
+               var node = get_node(i)
+               if node == null then
+                       push(e)
+                       return
+               end
+               var nnode = new ListNode[E](e)
+               var next = node.next
+               if next == null then
+                       _tail = nnode
+               else
+                       next.prev = nnode
+               end
+               nnode.prev = node
+               nnode.next = next
+               node.next = nnode
+       end
+
        # Append `l` to `self` but clear `l`.
        ##
        # O(1)
@@ -181,6 +201,7 @@ class List[E]
 
 
        redef fun iterator: ListIterator[E] do return new ListIterator[E](self)
+       redef fun reverse_iterator: ListIterator[E] do return new ListReverseIterator[E](self)
 
        # Build an empty list.
        init do end
@@ -280,7 +301,9 @@ class ListIterator[E]
        var _node: nullable ListNode[E]
 
        # The index of the current node
-       redef readable var _index: Int
+       var _index: Int
+
+       redef fun index do return _index
 
        # Remove the current item
        fun delete
@@ -295,6 +318,23 @@ class ListIterator[E]
        end
 end
 
+private class ListReverseIterator[E]
+       super ListIterator[E]
+
+       redef fun next
+       do
+               _node = _node.prev
+               _index -= 1
+       end
+
+       private init(list: List[E])
+       do
+               _list = list
+               _node = list._tail
+               _index = list.length
+       end
+end
+
 # Linked nodes that constitute a linked list.
 private class ListNode[E]
        super Container[E]
@@ -304,8 +344,8 @@ private class ListNode[E]
        end
 
        # The next node.
-       readable writable var _next: nullable ListNode[E]
+       var next: nullable ListNode[E]
 
        # The previous node.
-       readable writable var _prev: nullable ListNode[E]
+       var prev: nullable ListNode[E]
 end