Source code for dispel.providers.generic.tasks.pinch.modalities
"""A module containing functionality to process/filter specific modalities."""
from typing import Iterable, Set
from dispel.data.levels import Level
from dispel.data.values import AVEnum
from dispel.processing.level import LevelFilter
[docs]
class BubbleSizeModality(AVEnum):
    """Bubble size modality."""
    SMALL = ("small bubbles", "s")
    MEDIUM = ("medium bubbles", "m")
    LARGE = ("large bubbles", "l")
    EXTRA_LARGE = ("extra large bubbles", "xl") 
[docs]
class FingerModality(AVEnum):
    """Pinching fingers modality."""
    TOP_FINGER = ("top finger", "tf")
    BOTTOM_FINGER = ("bottom finger", "bf") 
[docs]
class AttemptOutcomeModality(AVEnum):
    """Pinching attempt success modality."""
    @property
    def is_success(self) -> bool:
        """Check if it is success modality."""
        return self == self.SUCCESS
    SUCCESS = ("successful pinches", "sp")
    FAILURE = ("failed pinches", "fp")
    ALL = ("all pinches", "ap") 
[docs]
class AttemptSelectionModality(AVEnum):
    """Pinching attempt selection modality."""
    @property
    def is_first(self) -> bool:
        """Check if it is the first attempt."""
        return self == self.FIRST
    FIRST = ("first attempt", "fa")
    ALL = ("all attempts", "aa") 
[docs]
class BubbleSizeModalityFilter(LevelFilter):
    """Filter for same bubble size modality."""
[docs]
    def __init__(self, size: BubbleSizeModality):
        self.size = size 
[docs]
    def repr(self):
        """Get representation of the filter."""
        return f"only {self.size.av}" 
[docs]
    def filter(self, levels: Iterable[Level]) -> Set[Level]:
        """Filter levels performed with a specific bubble size."""
        return set(
            filter(
                lambda level: self.size.variable
                == level.context.get_raw_value("bubbleSize"),
                filter(lambda level: level.context.has_value("bubbleSize"), levels),
            )
        )