aboutsummaryrefslogtreecommitdiff
path: root/var-value.go
diff options
context:
space:
mode:
Diffstat (limited to 'var-value.go')
-rw-r--r--var-value.go51
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
+}