119 lines
2.3 KiB
Go
119 lines
2.3 KiB
Go
|
package binding
|
||
|
|
||
|
type not struct {
|
||
|
Bool
|
||
|
}
|
||
|
|
||
|
var _ Bool = (*not)(nil)
|
||
|
|
||
|
// Not returns a Bool binding that invert the value of the given data binding.
|
||
|
// This is providing the logical Not boolean operation as a data binding.
|
||
|
//
|
||
|
// Since 2.4
|
||
|
func Not(data Bool) Bool {
|
||
|
return ¬{Bool: data}
|
||
|
}
|
||
|
|
||
|
func (n *not) Get() (bool, error) {
|
||
|
v, err := n.Bool.Get()
|
||
|
return !v, err
|
||
|
}
|
||
|
|
||
|
func (n *not) Set(value bool) error {
|
||
|
return n.Bool.Set(!value)
|
||
|
}
|
||
|
|
||
|
type and struct {
|
||
|
booleans
|
||
|
}
|
||
|
|
||
|
var _ Bool = (*and)(nil)
|
||
|
|
||
|
// And returns a Bool binding that return true when all the passed Bool binding are
|
||
|
// true and false otherwise. It does apply a logical and boolean operation on all passed
|
||
|
// Bool bindings. This binding is two way. In case of a Set, it will propagate the value
|
||
|
// identically to all the Bool bindings used for its construction.
|
||
|
//
|
||
|
// Since 2.4
|
||
|
func And(data ...Bool) Bool {
|
||
|
return &and{booleans: booleans{data: data}}
|
||
|
}
|
||
|
|
||
|
func (a *and) Get() (bool, error) {
|
||
|
for _, d := range a.data {
|
||
|
v, err := d.Get()
|
||
|
if err != nil {
|
||
|
return false, err
|
||
|
}
|
||
|
if !v {
|
||
|
return false, nil
|
||
|
}
|
||
|
}
|
||
|
return true, nil
|
||
|
}
|
||
|
|
||
|
func (a *and) Set(value bool) error {
|
||
|
for _, d := range a.data {
|
||
|
err := d.Set(value)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
type or struct {
|
||
|
booleans
|
||
|
}
|
||
|
|
||
|
var _ Bool = (*or)(nil)
|
||
|
|
||
|
// Or returns a Bool binding that return true when at least one of the passed Bool binding
|
||
|
// is true and false otherwise. It does apply a logical or boolean operation on all passed
|
||
|
// Bool bindings. This binding is two way. In case of a Set, it will propagate the value
|
||
|
// identically to all the Bool bindings used for its construction.
|
||
|
//
|
||
|
// Since 2.4
|
||
|
func Or(data ...Bool) Bool {
|
||
|
return &or{booleans: booleans{data: data}}
|
||
|
}
|
||
|
|
||
|
func (o *or) Get() (bool, error) {
|
||
|
for _, d := range o.data {
|
||
|
v, err := d.Get()
|
||
|
if err != nil {
|
||
|
return false, err
|
||
|
}
|
||
|
if v {
|
||
|
return true, nil
|
||
|
}
|
||
|
}
|
||
|
return false, nil
|
||
|
}
|
||
|
|
||
|
func (o *or) Set(value bool) error {
|
||
|
for _, d := range o.data {
|
||
|
err := d.Set(value)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
type booleans struct {
|
||
|
data []Bool
|
||
|
}
|
||
|
|
||
|
func (g *booleans) AddListener(listener DataListener) {
|
||
|
for _, d := range g.data {
|
||
|
d.AddListener(listener)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (g *booleans) RemoveListener(listener DataListener) {
|
||
|
for _, d := range g.data {
|
||
|
d.RemoveListener(listener)
|
||
|
}
|
||
|
}
|