core/sensorium/compiler/arena.py

34 lines
871 B
Python

"""Local, non-draining arenas for compiled sensorium units."""
from __future__ import annotations
from typing import Generic, TypeVar
from sensorium.compiler.delta import ContentAddressedDelta
from sensorium.compiler.protocol import CompilationUnitLike
U = TypeVar("U", bound=CompilationUnitLike)
class LocalArena(Generic[U]):
"""Share-nothing accumulation arena.
Snapshot is deliberately non-draining; flush/GC belongs to the merge owner.
"""
__slots__ = ("_units",)
def __init__(self) -> None:
self._units: list[U] = []
def push(self, unit: U) -> None:
self._units.append(unit)
def is_empty(self) -> bool:
return not self._units
def snapshot(self) -> ContentAddressedDelta[U]:
return ContentAddressedDelta.from_units(self._units)
def __len__(self) -> int:
return len(self._units)