merge API

merge

package

API reference for the merge package.

T
type

VectorClock

VectorClock represents the logical time of a value across different regions.
Key: RegionID, Value: Logical Clock Counter.

v1/merge/merge.go:10-10
type VectorClock map[string]uint64
S
struct

Value

Value wraps a value with a timestamp and vector clock used by merge strategies.

v1/merge/merge.go:75-80
type Value struct

Fields

Name Type Description
Data T
Timestamp time.Time
Vector VectorClock
Region string
I
interface

Strategy

Strategy defines how two values should be merged.

v1/merge/merge.go:83-85
type Strategy interface

Methods

Merge
Method

Parameters

old Value[T]
new Value[T]

Returns

Value[T]
func Merge(...)
T
type

MergeFn

MergeFn is a custom merge function provided by the developer.

v1/merge/merge.go:88-88
type MergeFn func(old, new T) (T, error)
S
struct

LastWriteWins

LastWriteWins is the default merge strategy which keeps the most recent value based on physical timestamp.
It falls back to Vector Clock comparison if available and timestamps are equal.

v1/merge/merge.go:92-92
type LastWriteWins struct
S
struct

Engine

Engine manages merge functions for specific keys.

v1/merge/merge.go:116-120
type Engine struct

Fields

Name Type Description
mu sync.RWMutex
custom map[string]MergeFn[T]
defaultStrategy Strategy[T]
F
function

NewEngine

NewEngine creates a new merge engine with LastWriteWins as default strategy.

Returns

*Engine[T]
v1/merge/merge.go:123-125
func NewEngine[T any]() *Engine[T]

{
	return &Engine[T]{custom: make(map[string]MergeFn[T]), defaultStrategy: LastWriteWins[T]{}}
}
F
function

TestEngineConcurrentAccess

Parameters

v1/merge/merge_test.go:9-34
func TestEngineConcurrentAccess(t *testing.T)

{
	e := NewEngine[int]()
	var wg sync.WaitGroup
	wg.Add(2)

	go func() {
		defer wg.Done()
		for range 100 {
			e.Register("key", func(old, new int) (int, error) {
				return new, nil
			})
		}
	}()

	go func() {
		defer wg.Done()
		for i := range 100 {
			_, err := e.Merge("key", Value[int]{Data: i, Timestamp: time.Now()}, Value[int]{Data: i + 1, Timestamp: time.Now()})
			if err != nil {
				t.Errorf("unexpected error: %v", err)
			}
		}
	}()

	wg.Wait()
}
S
struct

VersionedValue

VersionedValue keeps a history of values with timestamps.
It maintains only the most recent limit entries.

v1/merge/versioned.go:7-10
type VersionedValue struct

Fields

Name Type Description
versions []Value[T]
limit int
F
function

NewVersionedValue

NewVersionedValue creates a VersionedValue with the provided limit
and initializes it with the given value.

Parameters

v
Value[T]
limit
int

Returns

VersionedValue[T]
v1/merge/versioned.go:14-18
func NewVersionedValue[T any](v Value[T], limit int) VersionedValue[T]

{
	vv := VersionedValue[T]{limit: limit}
	vv.versions = append(vv.versions, v)
	return vv
}