+# A sequence of nodes
+# There is a specifc class (instead of a using Array) to track the parent/child relation when nodes are added or removed
+class ANodes[E: ANode]
+ super Sequence[E]
+ private var parent: ANode
+ private var items = new Array[E]
+ redef fun iterator do return items.iterator
+ redef fun length do return items.length
+ redef fun is_empty do return items.is_empty
+ redef fun push(e)
+ do
+ hook_add(e)
+ items.push(e)
+ end
+ redef fun pop
+ do
+ var res = items.pop
+ hook_remove(res)
+ return res
+ end
+ redef fun unshift(e)
+ do
+ hook_add(e)
+ items.unshift(e)
+ end
+ redef fun shift
+ do
+ var res = items.shift
+ hook_remove(res)
+ return res
+ end
+ redef fun has(e)
+ do
+ return items.has(e)
+ end
+ redef fun [](index)
+ do
+ return items[index]
+ end
+ redef fun []=(index, e)
+ do
+ hook_remove(self[index])
+ hook_add(e)
+ items[index]=e
+ end
+ redef fun remove_at(index)
+ do
+ hook_remove(items[index])
+ items.remove_at(index)
+ end
+ private fun hook_add(e: E)
+ do
+ #assert e.parent == null
+ e.parent = parent
+ end
+ private fun hook_remove(e: E)
+ do
+ assert e.parent == parent
+ e.parent = null
+ end
+end
+