"""
An immutable record of dice added to and removed from DiceTable
"""
from typing import Dict
from dicetables.eventsbases.eventerrors import DiceRecordError
from dicetables.eventsbases.protodie import ProtoDie
class RecordVerifier(object):
@staticmethod
def check_types(die_input):
if any(
not isinstance(die, ProtoDie) or not isinstance(num, int)
for die, num in die_input.items()
):
raise DiceRecordError("input must be {ProtoDie: int, ...}")
@staticmethod
def check_negative(die_input):
for key, val in die_input.items():
if val < 0:
raise DiceRecordError(
"Tried to create a DiceRecord with a negative value at {!r}: {}".format(
key, val
)
)
@staticmethod
def check_number(num):
if num < 0:
raise DiceRecordError("Tried to add_die or remove_die with a negative number.")
def scrub_zeroes(input_dict):
return {key: val for key, val in input_dict.items() if val}
[docs]
class DiceRecord(object):
def __init__(self, dice_number_dict: Dict[ProtoDie, int]):
RecordVerifier.check_types(dice_number_dict)
RecordVerifier.check_negative(dice_number_dict)
self._record = scrub_zeroes(dice_number_dict)
[docs]
@classmethod
def new(cls) -> "DiceRecord":
return cls({})
[docs]
def get_dict(self) -> Dict[ProtoDie, int]:
return self._record.copy()
[docs]
def get_number(self, query_die: ProtoDie) -> int:
return self._record.get(query_die, 0)
[docs]
def add_die(self, die: ProtoDie, times: int) -> "DiceRecord":
RecordVerifier.check_number(times)
new = self._record.copy()
new[die] = times + self.get_number(die)
return DiceRecord(new)
[docs]
def remove_die(self, die: ProtoDie, times: int) -> "DiceRecord":
RecordVerifier.check_number(times)
new = self._record.copy()
new[die] = self.get_number(die) - times
return DiceRecord(new)
[docs]
def __eq__(self, other):
if not isinstance(other, DiceRecord):
return False
return self.get_dict() == other.get_dict()
def __ne__(self, other):
return not self == other
def __repr__(self):
return "DiceRecord({!r})".format(self._record)