实现一个CRDT工具库——PNCounter
PNCounter
这段代码实现了一个PNCounter,即正负计数器。PNCounter是基于GCounter实现的,GCounter是一个只增不减的计数器,而PNCounter则是在GCounter的基础上增加了减操作。PNCounter由两个GCounter组成,一个用于记录增加操作,一个用于记录减少操作。value函数用于计算PNCounter的值,即增加操作的值减去减少操作的值。inc和dec函数分别用于增加和减少操作。merge函数用于合并两个PNCounter。
import GCounter
def PNCounter():
return (GCounter.GCounter(), GCounter.GCounter())
def zero():
return GCounter.zero(), GCounter.zero()
def value(pn: PNCounter):
inc, dec = pn
return {key: inc.get(key, 0) - dec.get(key, 0) for key in set(inc.keys()) | set(dec.keys())}
def inc(pn: PNCounter, key):
inc, dec = pn
return GCounter.inc(inc, key)
def dec(pn: PNCounter, key):
inc, dec = pn
return GCounter.inc(dec, key)
def merge(a: PNCounter, b: PNCounter):
inc_a, dec_a = a
inc_b, dec_b = b
return (GCounter.merge(inc_a, inc_b), GCounter.merge(dec_a, dec_b))
import java.util.HashMap;
import java.util.Map;
public class PNCounter {
private GCounter inc;
private GCounter dec;
public PNCounter() {
this.inc = new GCounter();
this.dec = new GCounter();
}
public static PNCounter zero() {
return new PNCounter();
}
public Map<String, Integer> value() {
Map<String, Integer> result = new HashMap<>();
Map<String, Integer> incMap = inc.value();
Map<String, Integer> decMap = dec.value();
for (String key : incMap.keySet()) {
result.put(key, incMap.get(key) - decMap.getOrDefault(key, 0));
}
for (String key : decMap.keySet()) {
if (!result.containsKey(key)) {
result.put(key, -decMap.get(key));
}
}
return result;
}
public void inc(String key) {
inc.inc(key);
}
public void dec(String key) {
dec.inc(key);
}
public void merge(PNCounter other) {
inc.merge(other.inc);
dec.merge(other.dec);
}
}
实现一个CRDT工具库——PNCounter的更多相关文章
- 如何手写一个js工具库?同时发布到npm上
自从工作以来,写项目的时候经常需要手写一些方法和引入一些js库 JS基础又十分重要,于是就萌生出自己创建一个JS工具库并发布到npm上的想法 于是就创建了一个名为learnjts的项目,在空余时间也写 ...
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-架构篇(1)
所谓字符串工具库就是利用javascript面向对象的知识封装一个常用的字符串处理方法库,首先给这个库起个名字,好吧就叫ghostwu.js. 看下ghostwu.js的整体架构: ; (functi ...
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展trim,trimLeft,trimRight方法(2)
我们接着上一篇的继续,在上一篇我们完成了工具库的架构,本文扩展字符串去空格的方法, 一共有3个 1,trimLeft: 去除字符串左边的空格 2,trimRight: 去除字符串右边的空格 3,tri ...
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展字符串位置方法(4)
本文,我们接着之前的框架继续扩展,这次扩展了一共有5个与字符串位置相关的方法 between( left, right ) 返回两个字符串之间的内容, 如果第二个参数没有传递,返回的是找到的第一个参数 ...
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展camelize与dasherize方法(3)
在此之前,我们已经完成了4个方法: trimLeft, trimRight, trim, capitalize 本文,我们扩展驼峰式与下划线转化这两个对称的方法 camelize: 把空格,下划线,中 ...
- 一个PHP高性能、多并发、restful的工具库(基于multi_curl)
This is high performance curl wrapper written in pure PHP. It's compatible with PHP 5.4+ and HHVM. N ...
- Underscore.js工具库
Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象. 他解决了这个问题:“如果我面对一个空白的 HTML ...
- JavaScript工具库
jPublic 交流QQ群:1017567122 前言 在我们开发项目的时候,无论项目规模大小,在所难免会写一些工具型函数来解决一些问题,随着项目开发和维护的时间越来越长,这些工具型函数会越来越多,同 ...
- 手把手教你使用Rollup打包📦并发布自己的工具库🔧
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...
- 自己的一个LESS工具函数库
自己大概在一年前开始使用LESS编写样式,现在感觉不用LESS都不会写样式了.现在写静态页面完全离不开LESS与Zen Coding,我可以不用什么IDE,但这两个工具却必须要,当然也强烈推荐看到这篇 ...
随机推荐
- HTML复习(18.图片样式)
重点 掌握图片样式属性(大小.边框.对齐)了解float属性 图片大小在CSS中,我们也是使用width和height这2个属性来定义图片的大小(也就是宽度和高度).在实际开发中,如果你需要多大的图片 ...
- go理论知识总结
基于const常量理解个中类型的内存分配引入参考 官方:Constant expressions may contain only constant operands and are evaluate ...
- ubuntu安装samba服务
第一步 sudo apt-get install samba samba-common 安装完成 第二步 建立一个文件夹作为共享目录 sudo mkdir /home/yz/my_samba my_ ...
- 系统U盘安装Windows无法打开install.wim的问题
我们在使用UltraISO工具制作Windows操作系统安装U盘,使用U盘启动,在安装Windows操作系统的过程中,出现类似"Windows无法打开所需的文件X:\sources\inst ...
- Linux系统管理实战-配置静态IP
配置静态IP 前置条件 防火墙: EL7 EL6 查看状态: # systemctl status firewalld # /etc/init.d/iptables status 立即关闭: # sy ...
- jsp第九周作业
1.做一个图书类Book id,name,price ,get,set访问器,构造方法2个,1个无参,1个有参做一个测试类,在main中创建3个图书对象,放到list集合中.做一个菜单,可以添加,删除 ...
- Glass Beads
UVA719 将循环串SSS展开成两倍大小:S+SS+SS+S,这样线性处理就可以处理所有循环的情况了.对S+SS+SS+S建立一个后缀自动机,让后从初始状态开始走,每次选择字典序最小的道路,走NNN ...
- vue引入多个指令文件
单个指令引入,在main.js(入口JS文件)中引入你已经写好的指令文件,可以省略文件后缀: // main.js import focus from 'xxx/directive'多个指令引入 Vu ...
- Swagger详解
1.Swagger的介绍 1.1 Swagger的工作原理 1.系统启动,扫描到api工程中的Swagger2Configuration类 2.在此类中指定了包路径,会找到在此包下及子包下标记有@Re ...
- Pytorch 感知机
单层感知机 \[\begin{aligned} & y = XW + b \\ & y = \sum x_i*w_i+b\\ \end{aligned} \] Derivative \ ...