Module orca_whirlpool.internal.utils.position_bundle_util

Expand source code
from typing import List, Optional
from ..accounts.types import PositionBundle
from ..constants import POSITION_BUNDLE_SIZE
from ..invariant import invariant


class PositionBundleUtil:
    @staticmethod
    def is_bundle_index_in_bounds(bundle_index: int) -> bool:
        return 0 <= bundle_index < POSITION_BUNDLE_SIZE

    @staticmethod
    def convert_bitmap_to_array(position_bundle: PositionBundle) -> List[bool]:
        result = []
        for bitmap in position_bundle.position_bitmap:
            result.append(bitmap & 0x01 > 0)
            result.append(bitmap & 0x02 > 0)
            result.append(bitmap & 0x04 > 0)
            result.append(bitmap & 0x08 > 0)
            result.append(bitmap & 0x10 > 0)
            result.append(bitmap & 0x20 > 0)
            result.append(bitmap & 0x40 > 0)
            result.append(bitmap & 0x80 > 0)
        return result

    @staticmethod
    def get_occupied_bundle_indexes(position_bundle: PositionBundle) -> List[int]:
        result = []
        for i, occupied in enumerate(PositionBundleUtil.convert_bitmap_to_array(position_bundle)):
            if occupied:
                result.append(i)
        return result

    @staticmethod
    def get_unoccupied_bundle_indexes(position_bundle: PositionBundle) -> List[int]:
        result = []
        for i, occupied in enumerate(PositionBundleUtil.convert_bitmap_to_array(position_bundle)):
            if not occupied:
                result.append(i)
        return result

    @staticmethod
    def is_full(position_bundle: PositionBundle) -> bool:
        unoccupied = PositionBundleUtil.get_unoccupied_bundle_indexes(position_bundle)
        return len(unoccupied) == 0

    @staticmethod
    def is_empty(position_bundle: PositionBundle) -> bool:
        occupied = PositionBundleUtil.get_occupied_bundle_indexes(position_bundle)
        return len(occupied) == 0

    @staticmethod
    def is_occupied(position_bundle: PositionBundle, bundle_index: int) -> bool:
        invariant(
            PositionBundleUtil.is_bundle_index_in_bounds(bundle_index),
            "invalid bundle_index"
        )
        array = PositionBundleUtil.convert_bitmap_to_array(position_bundle)
        return array[bundle_index]

    @staticmethod
    def is_unoccupied(position_bundle: PositionBundle, bundle_index: int) -> bool:
        return not PositionBundleUtil.is_occupied(position_bundle, bundle_index)

    @staticmethod
    def find_unoccupied_bundle_index(position_bundle: PositionBundle) -> Optional[int]:
        unoccupied = PositionBundleUtil.get_unoccupied_bundle_indexes(position_bundle)
        if len(unoccupied) == 0:
            return None
        else:
            return unoccupied[0]

Classes

class PositionBundleUtil
Expand source code
class PositionBundleUtil:
    @staticmethod
    def is_bundle_index_in_bounds(bundle_index: int) -> bool:
        return 0 <= bundle_index < POSITION_BUNDLE_SIZE

    @staticmethod
    def convert_bitmap_to_array(position_bundle: PositionBundle) -> List[bool]:
        result = []
        for bitmap in position_bundle.position_bitmap:
            result.append(bitmap & 0x01 > 0)
            result.append(bitmap & 0x02 > 0)
            result.append(bitmap & 0x04 > 0)
            result.append(bitmap & 0x08 > 0)
            result.append(bitmap & 0x10 > 0)
            result.append(bitmap & 0x20 > 0)
            result.append(bitmap & 0x40 > 0)
            result.append(bitmap & 0x80 > 0)
        return result

    @staticmethod
    def get_occupied_bundle_indexes(position_bundle: PositionBundle) -> List[int]:
        result = []
        for i, occupied in enumerate(PositionBundleUtil.convert_bitmap_to_array(position_bundle)):
            if occupied:
                result.append(i)
        return result

    @staticmethod
    def get_unoccupied_bundle_indexes(position_bundle: PositionBundle) -> List[int]:
        result = []
        for i, occupied in enumerate(PositionBundleUtil.convert_bitmap_to_array(position_bundle)):
            if not occupied:
                result.append(i)
        return result

    @staticmethod
    def is_full(position_bundle: PositionBundle) -> bool:
        unoccupied = PositionBundleUtil.get_unoccupied_bundle_indexes(position_bundle)
        return len(unoccupied) == 0

    @staticmethod
    def is_empty(position_bundle: PositionBundle) -> bool:
        occupied = PositionBundleUtil.get_occupied_bundle_indexes(position_bundle)
        return len(occupied) == 0

    @staticmethod
    def is_occupied(position_bundle: PositionBundle, bundle_index: int) -> bool:
        invariant(
            PositionBundleUtil.is_bundle_index_in_bounds(bundle_index),
            "invalid bundle_index"
        )
        array = PositionBundleUtil.convert_bitmap_to_array(position_bundle)
        return array[bundle_index]

    @staticmethod
    def is_unoccupied(position_bundle: PositionBundle, bundle_index: int) -> bool:
        return not PositionBundleUtil.is_occupied(position_bundle, bundle_index)

    @staticmethod
    def find_unoccupied_bundle_index(position_bundle: PositionBundle) -> Optional[int]:
        unoccupied = PositionBundleUtil.get_unoccupied_bundle_indexes(position_bundle)
        if len(unoccupied) == 0:
            return None
        else:
            return unoccupied[0]

Static methods

def convert_bitmap_to_array(position_bundle: PositionBundle) ‑> List[bool]
Expand source code
@staticmethod
def convert_bitmap_to_array(position_bundle: PositionBundle) -> List[bool]:
    result = []
    for bitmap in position_bundle.position_bitmap:
        result.append(bitmap & 0x01 > 0)
        result.append(bitmap & 0x02 > 0)
        result.append(bitmap & 0x04 > 0)
        result.append(bitmap & 0x08 > 0)
        result.append(bitmap & 0x10 > 0)
        result.append(bitmap & 0x20 > 0)
        result.append(bitmap & 0x40 > 0)
        result.append(bitmap & 0x80 > 0)
    return result
def find_unoccupied_bundle_index(position_bundle: PositionBundle) ‑> Optional[int]
Expand source code
@staticmethod
def find_unoccupied_bundle_index(position_bundle: PositionBundle) -> Optional[int]:
    unoccupied = PositionBundleUtil.get_unoccupied_bundle_indexes(position_bundle)
    if len(unoccupied) == 0:
        return None
    else:
        return unoccupied[0]
def get_occupied_bundle_indexes(position_bundle: PositionBundle) ‑> List[int]
Expand source code
@staticmethod
def get_occupied_bundle_indexes(position_bundle: PositionBundle) -> List[int]:
    result = []
    for i, occupied in enumerate(PositionBundleUtil.convert_bitmap_to_array(position_bundle)):
        if occupied:
            result.append(i)
    return result
def get_unoccupied_bundle_indexes(position_bundle: PositionBundle) ‑> List[int]
Expand source code
@staticmethod
def get_unoccupied_bundle_indexes(position_bundle: PositionBundle) -> List[int]:
    result = []
    for i, occupied in enumerate(PositionBundleUtil.convert_bitmap_to_array(position_bundle)):
        if not occupied:
            result.append(i)
    return result
def is_bundle_index_in_bounds(bundle_index: int) ‑> bool
Expand source code
@staticmethod
def is_bundle_index_in_bounds(bundle_index: int) -> bool:
    return 0 <= bundle_index < POSITION_BUNDLE_SIZE
def is_empty(position_bundle: PositionBundle) ‑> bool
Expand source code
@staticmethod
def is_empty(position_bundle: PositionBundle) -> bool:
    occupied = PositionBundleUtil.get_occupied_bundle_indexes(position_bundle)
    return len(occupied) == 0
def is_full(position_bundle: PositionBundle) ‑> bool
Expand source code
@staticmethod
def is_full(position_bundle: PositionBundle) -> bool:
    unoccupied = PositionBundleUtil.get_unoccupied_bundle_indexes(position_bundle)
    return len(unoccupied) == 0
def is_occupied(position_bundle: PositionBundle, bundle_index: int) ‑> bool
Expand source code
@staticmethod
def is_occupied(position_bundle: PositionBundle, bundle_index: int) -> bool:
    invariant(
        PositionBundleUtil.is_bundle_index_in_bounds(bundle_index),
        "invalid bundle_index"
    )
    array = PositionBundleUtil.convert_bitmap_to_array(position_bundle)
    return array[bundle_index]
def is_unoccupied(position_bundle: PositionBundle, bundle_index: int) ‑> bool
Expand source code
@staticmethod
def is_unoccupied(position_bundle: PositionBundle, bundle_index: int) -> bool:
    return not PositionBundleUtil.is_occupied(position_bundle, bundle_index)