package slicesx import "github.com/samber/lo" type Diff[T comparable, S ~[]T] struct { additionsMap map[T]struct{} additions S removalsMap map[T]struct{} removals S } func (d Diff[T, S]) Has(item T) bool { return d.InAdditions(item) || d.InRemovals(item) } func (d Diff[T, S]) InAdditions(item T) bool { if _, ok := d.additionsMap[item]; ok { return true } return false } func (d Diff[T, S]) InRemovals(item T) bool { if _, ok := d.removalsMap[item]; ok { return true } return false } func (d Diff[T, S]) Additions() S { return d.additions } func (d Diff[T, S]) Removals() S { return d.removals } func (d Diff[T, S]) HasChanged() bool { return len(d.additions) > 0 || len(d.removals) > 0 } func (d Diff[T, S]) Changed() S { return append(d.additions, d.removals...) } func NewDiff[T comparable, S ~[]T](base, new S) *Diff[T, S] { additions, removals := lo.Difference(base, new) additionsMap := lo.SliceToMap(additions, func(item T) (T, struct{}) { return item, struct{}{} }) removalsMap := lo.SliceToMap(removals, func(item T) (T, struct{}) { return item, struct{}{} }) return &Diff[T, S]{ additionsMap: additionsMap, additions: additions, removalsMap: removalsMap, removals: removals, } }