mirror of
https://github.com/vsariola/sointu.git
synced 2025-05-28 03:10:24 -04:00
43 lines
929 B
Go
43 lines
929 B
Go
package tracker
|
|
|
|
type (
|
|
// OptionalInt tries to follow the same convention as e.g. Int{...} or Bool{...}
|
|
// Do not confuse with types.OptionalInteger, which you might use as a model,
|
|
// but don't necessarily have to.
|
|
OptionalInt struct {
|
|
optionalIntData
|
|
}
|
|
|
|
optionalIntData interface {
|
|
Unpack() (int, bool)
|
|
Value() int
|
|
Range() intRange
|
|
|
|
setValue(int)
|
|
unsetValue()
|
|
change(kind string) func()
|
|
}
|
|
|
|
TrackMidiVelIn Model
|
|
)
|
|
|
|
func (v OptionalInt) Set(value int, present bool) (ok bool) {
|
|
if !present {
|
|
v.unsetValue()
|
|
return true
|
|
}
|
|
// TODO: can we deduplicate this by referencing Int{...}.Set(value) ?
|
|
r := v.Range()
|
|
if v.Equals(value, present) || value < r.Min || value > r.Max {
|
|
return false
|
|
}
|
|
defer v.change("Set")()
|
|
v.setValue(value)
|
|
return true
|
|
}
|
|
|
|
func (v OptionalInt) Equals(value int, present bool) bool {
|
|
oldValue, oldPresent := v.Unpack()
|
|
return value == oldValue && present == oldPresent
|
|
}
|