Skip to content

Releases: ponylang/crdt

Release list

0.2.0

Choose a tag to compare

@ponylang-main ponylang-main released this 04 Sep 01:30

Fixed to work with ponyc 0.70.0

ponyc 0.70.0 changed how type parameter constraints handle bare type names: a type name without an explicit capability now gets the type's default capability instead of #any. Intersection constraints that mixed explicit and bare capabilities stopped compiling because the bare side defaulted to ref instead of matching the explicit val.

Added explicit val capabilities to Equatable and Hashable in all affected type aliases.

[0.2.0] - 2026-09-04

Fixed

  • Fixed to work with ponyc 0.70.0 (PR #39)

0.1.0

Choose a tag to compare

@ponylang-main ponylang-main released this 19 Feb 12:37

Add core CRDT types

Implements the core set of delta-state CRDTs:

Counters:

  • GCounter - grow-only counter with saturated addition
  • PNCounter - positive-negative counter (increment and decrement)
  • CCounter - causal counter with dot-based tracking

Sets:

  • GSet - grow-only set (add only, never remove)
  • P2Set - two-phase set (elements can be removed once, permanently)
  • TSet - timestamp-based set with last-write-wins semantics
  • AWORSet - add-wins observed-remove set
  • RWORSet - remove-wins observed-remove set

Registers:

  • TReg - timestamp-based last-write-wins register
  • MVReg - multi-value register (retains concurrent values)

Collections:

  • TLog - sorted timestamped log with cutoff/trim
  • CKeyspace - compose CRDTs under named keys with shared causal context

All types support delta-state replication and token-based serialization.

use "crdt"

actor Main
  new create(env: Env) =>
    let a = GCounter(1)
    let b = GCounter(2)

    a.increment(10)
    b.increment(20)

    a.converge(b)
    b.converge(a)

    env.out.print(a.string()) // "30"

[0.1.0] - 2026-02-19

Added

  • Add core CRDT types (PR #3)