comp • gb.data • .list.item • index

.List.Item.Index (gb.data)

Return the index of this item.

Since a List is linked forwards and backwards, negative indices make sense. The non-negative indices behave as you would expect: 0 refers to the first element after the list head, 1 to the second, etc.. Negative indices relate to the end of the list -- but in one's complement, i.e. -1 is the first element before the list head, -2 the second-last element, etc.. This is so that List.Count + NegativeIndex = CorrespondingPositiveIndex.

To complicate things even more, since the List is circularly linked, there is no out-of-bounds condition. Indices just cycle around the end of the list to its beginning.

Rest assured that the implementation will always take the shortest way possible, though! There was quite some effort spent to relativise the cache-destructive nature of linked lists without any additional memory use. Internally, Current and all active enumerations are .List.Items which carry an Index. Traversals will regard them as "anchors" and try to get to a given index from them (in forward or backward direction) with the least elements in between as possible. This strategy will never traverse more than List.Count / 2 elements to get to any index.

This means that there are potentially infinitely many ways to address each element. This calls for a normal form for indices. A normalised index is a non-negative one, in the range of 0 and List.Count - 1 inclusively.

See also

List.AutoNormalize