{
  "nbformat": 4,
  "nbformat_minor": 5,
  "metadata": {
    "kernelspec": {
      "name": "aner",
      "display_name": "Aner",
      "language": "aner"
    },
    "language_info": {
      "name": "aner",
      "file_extension": ".aner"
    },
    "aner": {
      "execution_mode": "persistent-session",
      "runtime_mode": "development"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": "# Inspect a linked list\n\nOpen **Inspector**, then run each cell to see Node references and the append, prepend, and removal snapshots. Values can have different types. Choose **Prod** and rerun setup when observations are no longer needed.\n"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "// Read-only snapshots show node references; they never call user methods.\n",
        "import aner.dev\n",
        "\n",
        "class Node {\n",
        "    public let value\n",
        "    public var next: Node?\n",
        "}\n",
        "\n",
        "class LinkedList {\n",
        "    var head: Node?\n",
        "\n",
        "    fn prepend(value) { head = Node(value: value, next: head) }\n",
        "\n",
        "    fn append(value) {\n",
        "        let node = Node(value: value, next: null)\n",
        "        if head == null { head = node; return }\n",
        "        var cursor = head\n",
        "        while cursor.next != null { cursor = cursor.next }\n",
        "        cursor.next = node\n",
        "    }\n",
        "\n",
        "    fn remove_first(value) {\n",
        "        if head == null { return false }\n",
        "        if head.value == value { head = head.next; return true }\n",
        "        var cursor = head\n",
        "        while cursor.next != null {\n",
        "            if cursor.next.value == value {\n",
        "                cursor.next = cursor.next.next\n",
        "                return true\n",
        "            }\n",
        "            cursor = cursor.next\n",
        "        }\n",
        "        return false\n",
        "    }\n",
        "\n",
        "    fn len() {\n",
        "        var count = 0\n",
        "        var cursor = head\n",
        "        while cursor != null { count = count + 1; cursor = cursor.next }\n",
        "        return count\n",
        "    }\n",
        "}\n",
        "\n"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "let items = LinkedList(head: null)\n",
        "items.append(10)\n",
        "items.append(\"hello\")\n",
        "dev.capture(\"After two appends\", items)\n"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "items.prepend(1.5)\n",
        "dev.capture(\"After prepending a Float64\", items)\n"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "print(items.remove_first(\"hello\"))\n",
        "dev.capture(\"After removing the String node\", items)\n",
        "print(items.len())\n"
      ],
      "execution_count": null,
      "outputs": []
    }
  ]
}
