from . import TYPES
from .datatype import Datatype
[docs]class Counter(Datatype):
'''
A convergent datatype that represents a counter which can be
incremented or decremented. This type can stand on its own or be
embedded within a :class:`~aioriak.datatypes.Map`.
'''
type_name = 'counter'
_type_error_msg = 'Counters can only be integers'
def _post_init(self):
self._increment = 0
def _default_value(self):
return 0
@Datatype.modified.getter
def modified(self):
'''
Whether this counter has staged increments.
'''
return self._increment is not 0
def to_op(self):
'''
Extracts the mutation operation from the counter
:rtype: int, None
'''
if not self._increment == 0:
return ('increment', self._increment)
[docs] def increment(self, amount=1):
'''
Increments the counter by one or the given amount.
:param amount: the amount to increment the counter
:type amount: int
'''
self._raise_if_badtype(amount)
self._increment += amount
[docs] def decrement(self, amount=1):
'''
Decrements the counter by one or the given amount.
:param amount: the amount to decrement the counter
:type amount: int
'''
self._raise_if_badtype(amount)
self._increment -= amount
def _check_type(self, new_value):
return isinstance(new_value, int)
TYPES['counter'] = Counter