var-value.go 945 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package stm
  2. type VarValue interface {
  3. Set(any) VarValue
  4. Get() any
  5. Changed(VarValue) bool
  6. }
  7. type version uint64
  8. type versionedValue[T any] struct {
  9. value T
  10. version version
  11. }
  12. func (me versionedValue[T]) Set(newValue any) VarValue {
  13. return versionedValue[T]{
  14. value: newValue.(T),
  15. version: me.version + 1,
  16. }
  17. }
  18. func (me versionedValue[T]) Get() any {
  19. return me.value
  20. }
  21. func (me versionedValue[T]) Changed(other VarValue) bool {
  22. return me.version != other.(versionedValue[T]).version
  23. }
  24. type customVarValue[T any] struct {
  25. value T
  26. changed func(T, T) bool
  27. }
  28. var _ VarValue = customVarValue[struct{}]{}
  29. func (me customVarValue[T]) Changed(other VarValue) bool {
  30. return me.changed(me.value, other.(customVarValue[T]).value)
  31. }
  32. func (me customVarValue[T]) Set(newValue any) VarValue {
  33. return customVarValue[T]{
  34. value: newValue.(T),
  35. changed: me.changed,
  36. }
  37. }
  38. func (me customVarValue[T]) Get() any {
  39. return me.value
  40. }