This package is trying to mimic some functionalities of Python's deque from collections. Since there's already a deques implemented with seq, I had to call this RingDeque.
import ringDeque
var dq = newDeque("ghi")
echo dq                       # ['g', 'h', 'i']
dq.append('j')
dq.prepend('f')
echo dq.len                   # 5
echo dq                       # ['f', 'g', 'h', 'i', 'j']
echo dq.pop()                 # j
echo dq.popLeft()             # f
echo dq                       # ['g', 'h', 'i']
var n = dq.headNode # Gets the head node (of type DoublyLinkedNode) of the deque
echo n.value                  # g
echo n.next.value             # h
echo n.prev.value             # i
echo dq[0]                    # g
echo dq.head                  # g
echo dq[^1]                   # i
echo dq.tail                  # i
dq[1] = 'z'
echo dq                       # ['g', 'z', 'i']
dq[1] = 'h'
# dq[x] justs goes down the headNode.next chain x mod dq.len times
# Access the two ends will be fast.
# Access the middle of a long deque will be really slow.
# However, we only go at most dq.len steps
# These are the same as doing dq[0]
echo dq[9]                    # g
echo dq[^9]                   # g
let rdq = reversed(dq)        # Makes a reversed copy of dq
echo rdq                      # ['i', 'h', 'g']
echo 'h' in dq                # true
echo '@' in dq                # false
dq.extend("jkl")
echo dq                       # ['g', 'h', 'i', 'j', 'k', 'l']
dq.rotate(1)
echo dq                       # ['l', 'g', 'h', 'i', 'j', 'k']
dq.rotate(-1)
echo dq                       # ['g', 'h', 'i', 'j', 'k', 'l']
dq.reverse()                  # reverses dq in-place
echo dq                       # ['l', 'k', 'j', 'i', 'h', 'g']
dq.clear()                    # Empty the deque
try:
  discard dq.pop()
except ValueError:
  echo "raises ValueError if popping empty deque"
dq.extendLeft("abc")          # extendLeft() reverses the input order
echo dq                       # ['c', 'b', 'a']
# Utility proc step(node: var DoublyLinkedNode; n = 1)
# Helps with manipulating multiple cursors from a single deque.
var nodeA = dq.headNode
var nodeB = dq.headNode
nodeA.step(2)                 # step(n) to moves nodeA forward n times
echo nodeA.value              # a
nodeB.step(-2)                # step(-n) to moves nodeB backward n times
echo nodeA.value              # bPlease take a look at theTest.nim for more supported usages.