实现一个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,但这两个工具却必须要,当然也强烈推荐看到这篇 ...
随机推荐
- 29 Django自定义模板功能
在相应的app文件夹中,创建templatetags文件夹,必须是templatetags文件夹命名: 注意:templatetags文件夹中必须要有__init__.py文件 jd.py: from ...
- ubuntu上安装meson & 如何使用meson编译C代码
一· 搭建meson环境并简单编译: 1. 什么是meson Meson 旨在开发最具可用性和快速的构建系统.提供简单但强大的声明式语言用来描述构建.原生支持最新的工具和框架,如 Qt5 .代码覆盖率 ...
- opencv实战之透视变换
import cv2 import numpy as np import pytesseract def cv_show(imgname,img): cv2.imshow(imgname,img) c ...
- Python+Django(1)——建立项目
为项目新建一个目录,将其命名为learning_log,再在终端中切换到这个目录(Python 3): 运行模块venv 来创建一个名为ll_env的虚拟环境:python -m venv ll_en ...
- 如何简单使用Git
Git基本功能 Git基本功能 在具体介绍Git能做什么之前,先来了解下Git里的四个角色: workspace: 本地的工作空间. index:缓存区域,临时保存本地改动. local reposi ...
- C# 类库 dll 读取配置文件信息
一:给 C# 类库 dll 添加配置文件并读取配置信息 效果: 1.给类库程序添加配置文件,并命名为:类库名.DLL.config 如上面效果图,类库为:API.dll ,那么其对应的类库配置文件为: ...
- P2212 Watering the Fields S
题目描述 给定n个点,第i个点的坐标为(xi,yi)(xi,yi),如果想连通第i个点与第j个点,需要耗费的代价为两点的距离.第i个点与第j个点之间的距离使用欧几里得距离进行计算,即:(xi-xj ...
- java不返回某些字段,包括 null
一.使用 fastjson 包. (1) SimplePropertyPreFilter 可以将需要的字段留下来. import com.alibaba.fastjson.JSON;import co ...
- win10系统格式化后进行虚拟分区
1. 目的 目前win10磁盘分区多数人采用两种方式: 1:只分一个C盘,文件在C盘以目录区分. 缺点:所有文件都在一起,区分查找比较麻烦. 2:物理分区,分多个盘,如C,D,E等等 缺点:容量固定, ...
- django_url反向解析
**************************************************************************************************** ...