Coverage for src/arraybridge/array_payload.py: 100%

15 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-25 11:15 +0000

1"""Nominal contract for containers that preserve semantics around array data.""" 

2 

3from abc import ABC, abstractmethod 

4from collections.abc import Callable 

5from typing import Any, TypeVar 

6 

7ArrayPayloadT = TypeVar("ArrayPayloadT", bound="ArrayPayload") 

8 

9 

10class ArrayPayload(ABC): 

11 """Container whose array data can be transformed without losing its context.""" 

12 

13 @abstractmethod 

14 def array_payload_data(self) -> Any: 

15 """Return the concrete array governed by this payload.""" 

16 

17 @abstractmethod 

18 def with_data(self: ArrayPayloadT, data: Any) -> ArrayPayloadT: 

19 """Return this payload's context attached to replacement array data.""" 

20 

21 def map_array_payload( 

22 self: ArrayPayloadT, 

23 transform: Callable[[Any], Any], 

24 ) -> ArrayPayloadT: 

25 """Apply one array transform while preserving the payload container.""" 

26 

27 current_data = self.array_payload_data() 

28 transformed_data = transform(current_data) 

29 if transformed_data is current_data: 

30 return self 

31 return self.with_data(transformed_data)