summaryrefslogtreecommitdiffhomepage
path: root/util/checkchange/checkchange.go
blob: 45e3c0bf5466087f47f19d406f9920ea5482c7e5 (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
// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause

// Package checkchange defines a utility for determining whether a value
// has changed since the last time it was checked.
package checkchange

// EqualCloner is an interface for types that can be compared for equality
// and can be cloned.
type EqualCloner[T any] interface {
	Equal(T) bool
	Clone() T
}

// Update sets *old to a clone of new if they are not equal, returning whether
// they were different.
//
// It only modifies *old if they are different. old must be non-nil.
func Update[T EqualCloner[T]](old *T, new T) (changed bool) {
	if (*old).Equal(new) {
		return false
	}
	*old = new.Clone()
	return true
}