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())))
|