diff options
Diffstat (limited to 'var-value.go')
-rw-r--r-- | var-value.go | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/var-value.go b/var-value.go new file mode 100644 index 0000000..ff97104 --- /dev/null +++ b/var-value.go @@ -0,0 +1,51 @@ +package stm + +type VarValue interface { + Set(interface{}) VarValue + Get() interface{} + Changed(VarValue) bool +} + +type version uint64 + +type versionedValue struct { + value interface{} + version version +} + +func (me versionedValue) Set(newValue interface{}) VarValue { + return versionedValue{ + value: newValue, + version: me.version + 1, + } +} + +func (me versionedValue) Get() interface{} { + return me.value +} + +func (me versionedValue) Changed(other VarValue) bool { + return me.version != other.(versionedValue).version +} + +type customVarValue struct { + value interface{} + changed func(interface{}, interface{}) bool +} + +var _ VarValue = customVarValue{} + +func (me customVarValue) Changed(other VarValue) bool { + return me.changed(me.value, other.(customVarValue).value) +} + +func (me customVarValue) Set(newValue interface{}) VarValue { + return customVarValue{ + value: newValue, + changed: me.changed, + } +} + +func (me customVarValue) Get() interface{} { + return me.value +} |