aboutsummaryrefslogtreecommitdiff
path: root/chapter/6/resources/code/counters/python/state-based-increment-and-decrement-counter-correct.py
blob: 1ea726d9168ceb3802625ac1074b65cc8763b55c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class CvRDT:
    pass

class Counter(CvRDT):

    def __init__(self,
                 increments = None,
                 decrements = None):   # constructor function
        if increments is None:
            self._increments = [0] * length(replicas())
        else:
            self._increments = increments
        if decrements is None:
            self._decrements = [0] * length(replicas())
        else:
            self._decrements = decrements

    def increments(self):               # query function
        return list(self._increments)   # return a clone

    def decrements(self):               # query function
        return list(self._decrements)   # return a clone

    def value(self):                    # query function
        return (sum(self.increments()) -
                sum(self.decrements()))

    def increment(self):                # update function
        self._increments[self.replicaId()] += 1

    def decrement(self):                # update function
        self._decrements[self.replicaId()] += 1

    def compare(self, other):           # comparison function
        return (all(v1 <= v2 for (v1, v2) in
                    zip(self.increments(),
                        other.increments()))
                and
                all(v1 <= v2 for (v1, v2) in
                    zip(self.decrements(),
                        other.decrements())))

    def merge(self, other):             # merge function
        return Counter(increments = map(max, zip(self.increments(),
                                                 other.increments())),
                       decrements = map(max, zip(self.decrements(),
                                                 other.decrements())))