from abc import ABCMeta, abstractmethod
from multiprocessing import Process, Value
from typing import Dict, List

from combination.equipment_view import EquipmentView
from equipment.equipment_piece import EquipmentPiece, BodyPart
from scorer import Scorer


class CombinationAlgorithm:
    __metaclass__ = ABCMeta

    @abstractmethod
    def generate_equipment_views(
        self,
        equipment_by_body_part: Dict[BodyPart, List[EquipmentPiece]]
    ) -> List[EquipmentView]:
        pass

    @abstractmethod
    def create_combination_generation_process(
        self,
        equipment_views: List[EquipmentView],
        combination_queue,
        shared_increment: Value,
        scorer: Scorer
    ) -> Process:
        pass

    @abstractmethod
    def name(self) -> str:
        pass

from abc import ABCMeta, abstractmethod
from multiprocessing import Process, Value
from typing import Dict, List

from combination.equipment_view import EquipmentView
from equipment.equipment_piece import EquipmentPiece, BodyPart
from scorer import Scorer


class CombinationAlgorithm:
    __metaclass__ = ABCMeta

    @abstractmethod
    def generate_equipment_views(
        self,
        equipment_by_body_part: Dict[BodyPart, List[EquipmentPiece]]
    ) -> List[EquipmentView]:
        pass

    @abstractmethod
    def create_combination_generation_process(
        self,
        equipment_views: List[EquipmentView],
        combination_queue,
        shared_increment: Value,
        scorer: Scorer
    ) -> Process:
        pass

    @abstractmethod
    def name(self) -> str:
        pass
