diff --git a/Makefile b/Makefile
index b01c539..f78d3a6 100644
--- a/Makefile
+++ b/Makefile
@@ -78,7 +78,8 @@ test: test-unit test-functional codestyle phpstan
.PHONY: coverage
coverage:
- COVERAGE_OUTPUT_STYLE=html make test
+ COVERAGE_OUTPUT_STYLE=html make test-unit
+ COVERAGE_OUTPUT_STYLE=html make test-functional
.PHONY: test-unit
ifdef PHPUNIT_COVERAGE_OPTION
diff --git a/src/DataStructure/Naming-conventions-and-Mapping.MD b/src/DataStructure/Naming-conventions-and-Mapping.MD
new file mode 100644
index 0000000..ef3505e
--- /dev/null
+++ b/src/DataStructure/Naming-conventions-and-Mapping.MD
@@ -0,0 +1,101 @@
+# Naming conventions & mapping
+
+## SplHeap
+SplMinHeap / SplMaxHeap
+
+Construct โ ๐โฎ๐โฏ
+
+#### Add an element
+`add()`โ`insert()`
+
+TC: ๐โฎใ ๐โฏ
+SC: ๐โฎ๐ทโฏ
+
+#### Pop an element
+`pop()`โ`extract()`
+
+TC: ๐โฎใ ๐โฏ
+SC: ๐โฎ๐ทโฏ
+
+#### Peek element
+`peek()`โ`top()`
+
+TC: ๐โฎ๐ทโฏ
+SC: ๐โฎ๐ทโฏ
+
+#### DS size
+`size()`โ`count()`
+
+TC: ๐โฎ๐ทโฏ
+SC: ๐โฎ๐ทโฏ
+
+
+## SplPriorityQueue
+โน๏ธ Implemented using a `SplMaxHeap`
+
+#### Add an element
+`add()`โ`insert()`
+
+TC: ๐โฎใ ๐โฏ
+SC: ๐โฎ๐ทโฏ
+
+#### Pop an element
+`pop()`โ`extract()`
+
+TC: ๐โฎใ ๐โฏ
+SC: ๐โฎ๐ทโฏ
+
+#### Peek element
+`peek()`โ`top()`
+
+TC: ๐โฎ๐ทโฏ
+SC: ๐โฎ๐ทโฏ
+
+#### DS size
+`size()`โ`count()`
+
+TC: ๐โฎ๐ทโฏ
+SC: ๐โฎ๐ทโฏ
+
+
+## SplQueue
+โน๏ธ Implemented using a `SplDoublyLinkedList`
+
+#### Enqueue an element
+`enqueue()`
+
+#### Dequeue an element
+`dequeue()`
+
+#### Peek element
+`peek()`โ`bottom()`
+
+#### DS size
+`size()`โ`count()`
+
+#### Front / Rear
+โ ๏ธ Not actually available on "real" queue !
+
+`front()`โ`bottom()` โ `peek()`
+`rear()`โ`top()`
+
+## SplStack
+โน๏ธ Implemented using a `SplDoublyLinkedList`
+
+#### push an element
+`push()`
+
+#### pop an element
+`pop()`
+
+#### Peek element
+`peek()`โ`top()`
+
+#### DS size
+`size()`โ`count()`
+
+#### Front / Rear
+โ ๏ธ Not actually available on "real" stack !
+
+`front()`โ`top()` โ `peek()`
+`rear()`โ`bottom()`
diff --git a/src/Helper/ArrayHelper.php b/src/Helper/ArrayHelper.php
new file mode 100644
index 0000000..5063fd9
--- /dev/null
+++ b/src/Helper/ArrayHelper.php
@@ -0,0 +1,43 @@
+ $list โ Must be a 0 indexed list, 0 to n consecutive indexes !
+ * @phpstan-param list $list
+ * @param int $index โ Expected to be between 0 and ๐ !
+ * @param mixed $value
+ */
+ public static function insertAt(array &$list, int $index, mixed $value): void
+ {
+ $tailIdx = count($list) - 1;
+
+ // 1. Move values until the end of original list
+ $prevValue = $value;
+ while ($index <= $tailIdx) {
+ // Backup original value at $index + replace original value by the previous value
+ [$prevValue, $list[$index]] = [$list[$index], $prevValue]; // @phpstan-ignore parameterByRef.type
+ ++$index;
+ }
+
+ // 2. Append the original tail value at the end of the list (=new index !)
+ $list[$index] = $prevValue; // @phpstan-ignore parameterByRef.type
+ }
+}
diff --git a/tests/Technical/Helper/ArrayHelperTest.php b/tests/Technical/Helper/ArrayHelperTest.php
new file mode 100644
index 0000000..b9d85b2
--- /dev/null
+++ b/tests/Technical/Helper/ArrayHelperTest.php
@@ -0,0 +1,60 @@
+ [
+ 'list' => [1,2,3,4,5,7,8,9],
+ 'index' => 5,
+ 'value' => 6,
+ 'expected' => [1,2,3,4,5,6,7,8,9],
+ ],
+ 'Replace head value' => [
+ 'list' => [2,3,4,5,6,7,8,9],
+ 'index' => 0,
+ 'value' => 1,
+ 'expected' => [1,2,3,4,5,6,7,8,9],
+ ],
+ 'Replace tail value' => [
+ 'list' => [1,2,3,4,5,6,7,9],
+ 'index' => 7,
+ 'value' => 8,
+ 'expected' => [1,2,3,4,5,6,7,8,9],
+ ],
+ 'As new tail value' => [
+ 'list' => [1,2,3,4,5,6,7,8],
+ 'index' => 8,
+ 'value' => 9,
+ 'expected' => [1,2,3,4,5,6,7,8,9],
+ ],
+ 'Empty list' => [
+ 'list' => [],
+ 'index' => 0,
+ 'value' => 1,
+ 'expected' => [1],
+ ],
+ ];
+ }
+}