This commit is contained in:
2025-04-25 21:50:29 -07:00
parent 941b7a1f07
commit 893f7917ef
4 changed files with 67 additions and 7 deletions

Binary file not shown.

View File

@ -106,9 +106,52 @@ def _encode_binary(binary: Binary) -> bytes:
_write_u8(0)
_write_u32(len(binary.starting_state))
# TODO: No RLE for now
for b in binary.starting_state:
_write_u8(b)
# == encode RLE ==
def _pull_repeats(start: int, data: bytes) -> int | None:
i = 0
first_byte = data[start + i]
while True:
if i >= 255:
break
if start + i >= len(data):
break
if data[start + i] != first_byte:
break
i += 1
if i >= 2:
_write_u8(i)
_write_u8(first_byte)
return start + i
return None
def _pull_non_repeats(start: int, data: bytes):
i = 0
while True:
if i >= 255:
break
if start + i >= len(data):
break
if i >= 1 and data[start + i] == data[start + i - 1]:
break
i += 1
_write_u8(0)
_write_u8(i)
for j in range(i):
_write_u8(data[start + j])
return start + i
i = 0
while i < len(binary.starting_state):
if new_i := _pull_repeats(i, binary.starting_state):
i = new_i
continue
i = _pull_non_repeats(i, binary.starting_state)
return out.getbuffer()