Пример - Lists.IndexedList
## Код:
```
SearchElem = RECORD (Lists.Elem)
   ri-: Keys.SString32Key;
   i1: INTEGER;
END;
SearchElemPArr = POINTER TO ARRAY OF SearchElem;
MySearchList = RECORD (Lists.IndexedList)
   data*: POINTER TO ARRAY OF SearchElemPArr;
END;
```

Элементы List, Queue, Deque, Stack работают с указателем на массив указателей POINTER TO ARRAY OF %SearchElemPArr. Функцию NEW экономичнее вызывать для массива, чем для каждого его элемента.
Поле Keys.SString32Key означает наличие строкового ключа, по которому можно проводить сравнение. Где сравнение, там и сортировка, и бинарный поиск.
## Код:
```
li.Init(params);
el.ri.name := "orange"; el.i1 := 2; li.PushBack(el);
el.ri.name := "red"; el.i1 := 1; li.PushFront(el);
el.ri.name := "yellow"; el.i1 := 3; li.Insert(Lists.iterNil, el);
el.ri.name := "green"; el.i1 := 4; li.PushBack(el);
el.ri.name := "lightblue"; el.i1 := 5; li.PushBack(el);
el.ri.name := "blue"; el.i1 := 6; li.PushBack(el);
li.Sort;
el.ri.name := "lightblue";
found := li.Find(el, it);
Log.String("lightblue Find="); Log.Bool(found); Log.Int(it.r);  Log.Int(it.c); Log.Char(' ');
```

Можно делать списки, очереди и др из Ваших пользовательских структур.

Если понадобятся другие ключи, не целые и не строки, нужно добавить функцию сравнения аналогично тому, как это сделано для LongKey:
## Код:
```
PROCEDURE LongCompare (VAR n1: LONGINT; VAR n2: LONGINT): INTEGER;
BEGIN
   RETURN SHORT(n1-n2)
END LongCompare;
PROCEDURE (VAR ri: LongKey) GetComparator* (VAR compare: Base.Comparator);
BEGIN
   SYSTEM.PUT(SYSTEM.ADR(compare), SYSTEM.ADR(LongCompare));
END GetComparator;
```
