Native functions deque library

# Native functions for double-ended queues

**Note**: these functions are proposed for the next firmware release and are not available in Thymio robots

The *Deque* native library provides functions for double-ended queue operations in an object-oriented style on specially-formatted arrays. The array for a *deque* object must be of size $2 + m \cdot k\,\,$, where $k$ is the size of the tuples^{1} in the deque, and $m$ is the maximum number of tuples to be stored. An *index* $i$ into a deque is between two elements: the integer $i$ counts the number of elements to the left of the index.

`deque.size(Q,n)`- Set $n$ to the number of elements in deque $Q$. If $n=0$ then $Q$ is empty. Note that $n$ must be divided by the tuple size to obtain the number of tuples in $Q$.
`deque.push_front(Q,A)`- Insert tuple $A$ before the first tuple of deque $Q$.
`deque.push_back(Q,A)`- Insert tuple $A$ after the last tuple in deque $Q$.
`deque.pop_front(Q,A)`- Remove the first
*length*($A$) elements of deque $Q$ and place them in tuple $A$. `deque.pop_back(Q,A)`- Remove the last
*length*($A$) elements of deque $Q$ and place them in tuple $A$. `deque.get(Q,A,i)`- Copy into tuple $A$,
*length*($A$) elements from deque $Q$ starting from index $i$. `deque.set(Q,A,i)`- Copy into deque $Q$ starting at index $i$,
*length*($A$) elements from tuple $A$. `deque.insert(Q,A,i)`- Shift right the suffix of deque $Q$ starting at index $i$ by
*length*($A$) elements, then copy tuple $A$ into the deque $Q$ at that index. `deque.erase(Q,i,k)`- Erase $k$ elements from deque $Q$ at index $i$ by shifting the suffix starting from $i+k$ left. Length $k$ should be the tuple size or a multiple.

### Example

Here is a simple motion queue, that accepts *operations* defined by a time and motor speeds, and executes them first-in, first-out.

```
var operation[3] # Tuple of size 3
var Queue[2 + (3*40)] # Store up to 40 operation tuples
var n
sub motion_add
call deque.push_back(Queue, event.args[0:2])
onevent timer0
call deque.size(Queue, n)
if n > 0 then
call deque.pop_front(Queue, operation)
timer.period[0] = operation[0]
motor.left.target = operation[1]
motor.right.target = operation[2]
end
```