Verified Commit c29bc99d authored by Jakob Moser's avatar Jakob Moser
Browse files

Clean table of contents code minimally

parent 79e302f6
Loading
Loading
Loading
Loading
+0 −17
Original line number Diff line number Diff line
@@ -12,8 +12,6 @@ class Node[T]:
    parent: Node[T] | None = field(repr=False)
    children: list[Node[T]] = field(default_factory=list)

    _prime_possible_parent: Node[T] | None = field(default=None, init=False)

    def can_nurse_at(self, level: int) -> bool:
        """Return if the given level is greater than one's own level, i.e., if content with this level
        could be a child of this node.
@@ -31,21 +29,6 @@ class Node[T]:
        self.children.append(node)
        return node

    def append(self, level: int | float, content: T) -> None:
        while True:
            if not self._prime_possible_parent:
                # Take care of the node myself, and note it down as next prime possible parent
                self._prime_possible_parent = self._nurse(level, content)
                return
            elif self._prime_possible_parent.can_nurse_at(level):
                # If the prime possible parent can nurse at this level, let it nurse the node,
                # and make the newly inserted node the next prime possible parent
                self._prime_possible_parent = self._prime_possible_parent._nurse(level, content)
                return
            else:
                # Go up once
                self._prime_possible_parent = self._prime_possible_parent.parent

    @classmethod
    def new_root(cls) -> Node[T]:
        return cls(-inf, None, None)
+28 −0
Original line number Diff line number Diff line
from collections.abc import Iterable

from coliverter.toc.Node import Node

type Level = int
type Entry[T] = tuple[Level, T]


def _append_entry[T](prime_possible_parent: Node[T], entry: Entry[T]) -> Node[T]:
    level, content = entry
    while True:
        if prime_possible_parent.can_nurse_at(level):
            # If the prime possible parent can nurse at this level, let it nurse the node,
            # and make the newly inserted node the next prime possible parent
            return prime_possible_parent._nurse(*entry)
        else:
            # Go up once
            prime_possible_parent = prime_possible_parent.parent


def make_toc[T](entries: Iterable[Entry[T]]) -> Node[T]:
    root = Node.new_root()
    prime_possible_parent = root

    for entry in entries:
        prime_possible_parent = _append_entry(prime_possible_parent, entry)

    return root